mysql 索引的一些事
索引是什么
索引相当于一本书的目录 数据就是书里面的正文内容
想要快速的找到自己的想要的章节 就先查看目录再找到对应的页面
如果没有索引就相当于从第一页开始找一样。
索引越多越好吗?
数据的变更(增删改)都需要维护索引,因此更多的索引意味着更多的维护成本
更多的索引意味着更多的空间 (100页书 50页目录 不合理)
过小的表建立索引会更慢 (2页书 还建立目录吗?)
索引的字段类型问题
text类型,也可建索引(需指定长度)
myisam存储引擎索引键长度综合不能超过1000字节
用来筛选的值尽量保持和索引列同样的数据类型
怎么才能用到索引
以下操作符也可用到索引:
<,<=,=,>,>=,BETWEEN,IN
like也可以用到索引,尽量减少like,”xxx%” 是可以用到索引的,“%xxx %xxx%”这两种是用不到索引的
<>,not in,!=则不行
对列进行函数运算的情况(如 where md5(password) = “xxxx”)
WHERE index=1 OR a=10
存了数值的字符串类型字段(如手机号),查询时记得不要丢掉值的引号,否则无法用到该字段相关索引,反之则没关系
select * from test where mobile = 13312345678;
可是无法用到mobile字段的索引的哦(如果mobile是char 或 varchar类型的话)
*一次查询不能用多个索引*
什么样的字段不适合建索引?
一般来说,列的值唯一性太小(如性别,类型什么的),
不适合建索引(怎样叫太小?一半说来,同值的数据超过表的百分之15,那就没必要建索引了)
太长的列,可以选择只建立部分索引,(如:只取前十位做索引)
更新非常频繁的数据不适宜建索引
多列查询该如何建索引?
一次查询只能用到一个索引,所以 首先否定a,b各建索引方案
a还是b?谁的同值的最少,建谁
当然,联合索引也是个不错的方案,ab,还是ba,则同上,区分度高者,在前
联合索引的问题
where a = “xxx” 可以使用 ab 联合索引
where b = “xxx” 则不可
所以,大多数情况下,有ab索引了,就可以不用在去建一个A索引了
覆盖索引(Covering Indexes)拥有更高效率
索引包含了所需的全部值的话,就只select 他们,换言之,只select需要用到的字段,
如无必要,可尽量避免select *
NULL 的问题
NULL会导致索引形同虚设,所以在设计表结构时应避免NULL的存在(用其他方式表达你想表达的NULL,比如 -1,0)
如何查看索引信息,如何分析是否正确用到索引
show index from tablename;
explain select …