1、Mysql中ACID的原理一系列问题
https://www.cnblogs.com/CuiHongYu/p/10845354.html
2、用limit进行分页会影响性能
http://www.cleey.com/blog/single/id/793.html
3、索引结构
为什么Mysql用B+树当索引,而不用B树或红黑树?
4、索引失效的情况
-
违背了最左前缀法则时,索引失效
-
符合最左前缀法则,但中间出现跳跃某一列,则只有跳跃的列前符合法则的索引生效:
例: 设置索引为 a,b,cselect * from 表 where a = '' and c = '';
此时索引生效范围仅为a
-
符合最左前缀法则,但使用了范围查询,则范围查询之后的列索引失效
select * from 表 where a = '' and b < '' and c = '';
此时索引生效范围为a,b
-
不要在索引列上进行运算操作,索引将失效
比如substring等运算操作 -
查询的列为字符串,没有加单引号时,索引失效
由于在查询时没有对字符串加单引号,MySQL的查询优化器,会自动的进行类型转换,造成索引失效。 -
用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到
select * from 表 where a = '' or d = '';
由于d列没有建立索引,即使a建立了索引,用or连接以后a的索引也会失效
-
以%开头的Like模糊查询,索引失效
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效select * from 表 where a = '%xxxx%';
此时a的索引将会失效
解决方法:使用覆盖索引(即select 只选择已经建立索引的列)
select a,b,c from 表 where a = '%xxxx%';
这种情况下索引有效
-
如果MySQL评估使用索引比全表更慢,则不使用索引
-
使用is NULL , is NOT NULL 有时索引失效
-
使用 in 时会走索引, 使用 not in 时索引失效
In 和 not in 是用来判断表达式的值是否位于给出的列表中select * from 表 where a (not) in(value,value);