深入浅出Mysql索引的那些事儿
对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。 3.索引列排序 mysql一张表查询只能用到一个索引。因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。这一点是很多程序猿容易忽略的,如where子句的字段建了索引,排序的字段建了索引,但是分开建的,以为会走索引,其实这样的话排序的字段不会使用索引的,除非建复合索引,切记。 4.like语句操作 一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like '%aaa%'不会使用索引,而like 'aaa%'可以使用索引。 5.不要在列上进行运算 6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的。 7.索引要建立在经常进行select操作的字段上。 这是因为,如果这些列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 8.索引要建立在值比较唯一的字段上。 9.对于那些定义为text、image和bit数据类型的列不应该增加索引。因为这些列的数据量要么相当大,要么取值很少。 10.在where和join中出现的列需要建立索引。 11.where的查询条件里有不等号(where column != ...),mysql将无法使用索引。 12.如果where字句的查询条件里使用了函数(如:where DAY(column)=...),mysql将无法使用索引。 13.在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用。这一点很容易忽略,切记,切记,切记! 14.在进行联表查询时,建立关联的表的字段类型最好一样且长度一致,这样能更好的发挥索引的作用。 15.组合索引时切记此条约束:组合索引中有多个字段,其中一个字段是有范围判断,则需将此字段在最后面。如
因为age会有范围判断,则建组合索引时将AGE字段放在后面。 16.字符集字段比较,UTF8与UTF-BIN联合查询是不能走索引的。 如某张表的order_no字段类型为varchar(50),另一张表的order_no字段类型为varchar(50) COLLATE utf8_BIN。则此时联合查询时不能走索引的,切记。 即两张表的字段类型如下:
17.以下几种情况不适合建索引:
18.给表创建主键,对于没有主键的表,在查询和索引定义上有一定的影响。 19.避免表字段为null,建议设置默认值(如int类型设置默认值为0),这样在索引查询上,效率会高很多。 20.关于order by的索引问题重点说下:
因为优化器认为走二级索引再去回表成本比全表扫描排序更高,所以选择走权标扫描。
因为优化器认为根据索引有序性去回表查数据,然后得到m条数据,就可以终止循环, 那么成本比全表扫描小,则选择走二级索引。 即便没有二级索引,mysql针对order by limit也做了优化,采用堆排序。
【编辑推荐】
点赞 0 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |