mysql常见函数面试题_MySQL常见面试题

1、MySQL常见数据库引擎及比较?

答:InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

2、什么是事务?MySQL如何支持事务?

答:原子性、一致性、隔离性、持久性

在mysql中用的最多的存储引擎有:innodb,bdb,myisam

,memory 等。

其中innodb和bdb支持事务而myisam等不支持事务。

3、索引类型:FULLTEXT,HASH,BTREE,RTREE。

4、MySQL索引种类

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

答:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引

5、索引在什么情况下遵循最左前缀的规则?

答:最左前缀原理的一部分,索引index1:(a,b,c),只会走a、a,b、a,b,c

三种类型的查询,其实这里说的有一点问题,a,c也走,但是只走a字段索引,不会走c字段。

索引是有序的,index1索引在索引文件中的排列是有序的,首先根据a来排序,然后才是根据b来排序,最后是根据c来排序。

13、列举

创建索引但是无法命中索引的情况。

答:1) 索引本身失效

2) 没有查询条件,或者查询条件没有建立索引

3) 在查询条件上没有使用引导列

4) 对小表查询

5) 查询的数量是大表中的大部分数据。

5)对列使用函数,该列的索引将不起作用。如:substring(字段名,1,2)='xxx';

6)对列进行运算(+,-,*,/,!

等),该列的索引将不起作用。

如:select * from test where

id-1=9;//错误的写法

select * from test where

id=10; //正确的写法

7)某些情况下的LIKE操作,该列的索引将不起作用。如:字段名LIKE

CONCAT('%', '2014 - 08 - 13', '%')

8)某些情况使用反向操作,该列的索引将不起作用。如:字段名<> 2

9)在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用

10)隐式转换导致索引失效。由于表的字段t_number定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效。

如:

select * from test where t_number=13333333333;

//错误的写法

select * from test where

t_number='13333333333'; //正确的写法

11)使用not

in ,not exist等语句时

12)当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。

13)当B-tree索引

is null不会失效,使用is

not null时,会失效,位图索引

is null,is not null 都会失效。

14)联合索引

is not null 只要在建立的索引列(不分先后)都会失效。

14、如何开启慢日志查询?

答:MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。slow_query_log

=1

slow_query_log_file=/application/mysql/data/localhost-slow.log

long_query_time = 1

15、数据库优化方案?

答:a4c26d1e5885305701be709a3d33442f.png

优化之前先开启慢查询日志,并通过explain进行分析。然后对sql及索引进行优化。必要的时候对数据结构,数据类型进行优化。

MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可

16、1000w条数据,使用limit

offset 分页时,为什么越往后翻越慢?如何解决?

答: 先查主键,在分页。 select * from tb where id

in(select

id from tb where limit 10 offset 20)

23、简述数据库主从复制(Master-Slave)和读写分离(MySql-Proxy)?

答:主从复制

配置Master主服务器

1)在Master

MySQL上创建一个用户‘repl’,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步。

2)找到MySQL安装文件夹修改my.Ini文件。mysql中有好几种日志方式,我们只要启动二进制日志log-bin就ok。

配置Slave从服务器(windows)

1)配置MySQL安装文件夹修改my.ini文件

2)连接Master,执行sql

3)启动Slave

读写分离

数据库Master主服务器:192.168.10.130

数据库Slave从服务器:192.168.10.131

MySQL-Proxy调度服务器:192.168.10.132

MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。

1.当MySQL主从复制在

show slave status\G 时出现Slave_IO_Running或Slave_SQL_Running

的值不为YES时,需要首先通过

stop slave 来停止从服务器,然后再执行一次本文,但如果想尽可能的同步更多的数据,可以在Slave上将master_log_pos节点的值在之前同步失效的值的基础上增大一些,然后反复测试,直到同步OK。因为MySQL主从复制的原理其实就是从服务器读取主服务器的binlog,然后根据binlog的记录来更新数据库。

2.MySQL-Proxy的rw-splitting.lua脚本在网上有很多版本,但是最准确无误的版本仍然是源码包中所附带的lib/rw-splitting.lua脚本,如果有lua脚本编程基础的话,可以在这个脚本的基础上再进行优化;

3.MySQL-Proxy实际上非常不稳定,在高并发或有错误连接的情况下,进程很容易自动关闭,因此打开--keepalive参数让进程自动恢复是个比较好的办法,但还是不能从根本上解决问题,因此通常最稳妥的做法是在每个从服务器上安装一个MySQL-Proxy供自身使用,虽然比较低效但却能保证稳定性;

4.一主多从的架构并不是最好的架构,通常比较优的做法是通过程序代码和中间件等方面,来规划,比如设置对表数据的自增id值差异增长等方式来实现两个或多个主服务器,但一定要注意保证好这些主服务器数据的完整性,否则效果会比多个一主多从的架构还要差;

5.MySQL-Cluster 的稳定性也不是太好;

6.Amoeba for MySQL 是一款优秀的中间件软件,同样可以实现读写分离,负载均衡等功能,并且稳定性要大大超过MySQL-Proxy,建议大家用来替代MySQL-Proxy,甚至MySQL-Cluster。

24、简述数据库分库分表?(水平、垂直)

答:(1)数据库分表

把一张表按照一定的规则分解成不同的实体表。比如垂直划分和水平划分

垂直切分:把不同功能,不同模块的数据分别放到不同的表中,但是如果同一个模块的数据量太大就会存在性能瓶颈

水平切分:垂直切分解决不了大表的瓶颈,如果同一个功能中表的数据量过大,就要对该表进行切分,为水平切分

通俗理解:垂直切分---分不同的模块表;水平切分---分同一个模块下的多个表

(2)分库

将一堆数据放到不同的数据库中保存,上面说的都是在同一个数据库上,分库是分到不同的数据库上

你可能感兴趣的:(mysql常见函数面试题)