mysql索引问题

查询索引使用的频率使用  show status like ‘handler_read%';
handler_read_key这个值越高越好,越高表示使用索引查询到的次数
handler_read_rnd_next这个值越高,说明查询低效
查看表索引  show index from tablename
explain select…

索引失效的情况:
1.若条件中有or,即使其中有条件带有索引也不会使用(除非每个or条件中的列都有索引)
2.对于多列索引,不是使用的第一部分,则不会使用索引
3.like查询,%开头索引失效,%结尾可以使用索引
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.若mysql估计使用全表扫描要比使用索引快,则不使用索引
6.不可用到索引的操作符<> , not in , !=  (可以用到索引的操作符可用到索引的操作符> <= = > >= between in)
7.null会导致索引形同虚设,在设计表结构时应避免null的存在,用其他比如-1来表示null

其他不可使用索引的情况 对列进行函数运算的情况(如where md5(password)=’xxx’)
where index=1 or a=10
存了数值的字符串类型(如手机号),查询时丢了引号

不适合使用索引的情况
1.数据的(增删改)都需要维护索引
2.索引以为着需要更多的空间
3.过小的表
4.列的值唯一性太小(如:性别 类型),(同值的数据超过表的15%)
5.太长的列,可以选择只建立部分索引(如:只取前十位做索引)
6.更新非常频繁的数据不适合建索引

建立索引需要注意
text类型,也可建索引(需指定长度)
myisam存储引擎索引键长度综合不能超过1000字节
用来筛选的值尽量保持和索引列同样的数据类型

联合索引
一次查询不能使用多个索引
多列查询该如何建索引:要么a要么b,当然联合索引也是个不错的解决方案,ab还是ba
where a=’xxx’可以使用ab联合索引
where b=’xxx’则用不到联合索引
大多数情况下,有ab索引了,就可以不用再去建a索引了

评论

目前评论:0   

点击加载更多评