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、数据库优化方案?
答:
优化之前先开启慢查询日志,并通过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)分库
将一堆数据放到不同的数据库中保存,上面说的都是在同一个数据库上,分库是分到不同的数据库上