首页 > Linux操作系统 > Linux操作系统 > MySQL索引使用经验
在MySQL中,有时候一个好的索引就能解决一个系统性能问题,索引的确是个好东西。所以有些人只要遇到查询,就往查询字段上加索引。
但是索引是越多越好吗?索引在innodb与myisam中是一样的吗?任何列都适合加索引吗?
在另一篇文章中,详细介绍了innodb与myisam中索引的区别,详见:http://blog.itpub.net/28912557/viewspace-1101318/,今天这里只浅入浅出地讨论使用索引的一些经验。
一般创建索引的几条经验:
1,innodb存储引擎的主键是聚集存储的,一般创建一个自增列作为主键。如果主键是采用业务字段,或者类似uuid32这样非单调的、且占用较多存储空间的字段,这是非常不合适的。
一来在insert时,为了维护索引树的特性而要分裂、调整节点,十分低效!另外uuid32太大,致使辅助索引占用更多的空间,因为辅助索引保存主键的值。
2:复合索引遵循最左前缀原则,要把最常使用的字段或选择性最好的字段放在最前面。
3:对经常修改的字段不要创建索引,维护的成本大。
4:索引不是越多越好,过多的索引,会造成数据更新时的低效,因为要维护很多索引树,过多的索引还占用太多空间。
最左前缀原则:指的是在sql where 中出现的列的顺序要保持和多索引的一致或以多列索引顺序出现,只要出现非顺序、断层都无法利用到多列索引。
举例:index (username, password, time),
可以利用到索引的where情况:(username)、(username,password),(username,password,time),(username,time)
对于or语句,如果or前后两个条件列都有索引,查询将使用索引,如果前后有一个条件列没有索引,则查询不使用索引。
EXPLAIN SELECT * FROM test t WHERE t.`name` LIKE 'tian7%' OR t.`id` = 1

将name上的索引去掉,这时type=all

单独使用比较列(!=、>、<、<=、>=)无法利用多列索引,放在其它位置可以利用。(但主键可以,如 id !=123,这是可以利用索引的,type=range)
show index from xxx,可以查看表的索引
Cardinality:索引基数,很关键的一个参数,平均数值组=索引基数/表总数据行,平均数值组越接近1就越有可能利用索引。
MyISAM对索引的长度限制是1000字节,InnoDB是767字节,如果创建索引的字段超过指定长度(与字符集有关),则取前缀索引,如InnoDB、utf8下,如果varchar(300),则创建的索引长度为255
like与索引:'XXX%'能用到索引,'%XXXX%'不能。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28912557/viewspace-762045/ ,如需转载,请注明出处,否则将追究法律责任。