关于mysql性能调优和mysql索引失效
由于现在政府部门导入的工作量很大,而且一次好几十个文件,
导致写入mysql的数据量很大,单表几百万条数据。
mysql数据量一旦大起来,删除,查询都会很慢
所以最近领导们在往mysql表中加索引。
今天听到领导们在讨论,因为在我们在从mysql取数据向es中导入的过程中使用的是批量读取。
批量读取,这里写的是limit,其中一个领导说,limit分页会使索引失效,因为limit比如取第120页,是取出来120页,然后舍弃前119页,所以导致索引失效
(当然, 这是他调查了日志发现的,估计是跟了源码,不是从网上的观点,而是自己动手得出的结论)。
我立马回忆起来了,当时说索引失效,确实有一些情况的。
我整理了一下,如下:
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
2. like查询以%开头不能使用索引
3. 隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 如果表的字段定义为varchar,有索引,但传的是int,此时索引失效。反之如果字段类型是int,value是字符串,却并不影响索引。
4. 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10;
5. 单独引用复合索引里非第一位置的索引列
6. not in ,not exist.
7. B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
8. 联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
这方面感觉还有很多能研究的地方,当然我本身是看好key-value数据库的

浙公网安备 33010602011771号