索引可以帮助我们更快查询、排序。但在使用上要避免一些导致索引失效的情况,同时要合理的使用索引,毕竟索引也是有缺点的,建立不当也会导致查询更慢,维护困难。
- 索引列上不能使用表达式或函数
- 对字符串建立前缀索引(因为不同引擎对索引列的长度有限制,所以字符串太长无法建立索引或者索引查询效率很低)
CREATE INDEX INDEX_NAME ON table(col_name(n)) //n即为前缀长度
3.注意前缀索引列的选择性 : 索引的选择性是不重复的索引值和表的记录数的比值。不要选择性太小。
abcio,abeop,cedui,ceaop。 比较前缀索引宽度为2和为3的选择性。
4.可以的话,建立合适的联合索引而不是给每一列都建立索引
5.建立联合索引时:经常会被使用到的列放在最左边(最左匹配原则),选择性高的列优先,宽度小(长度)的列优先
6.避免使用like查询以'%'开头
7.避免使用select * ......进行查询。
8.可以为所有要查询的列建立索引(覆盖索引(innodb)),默认的主键索引列可以直接使用。覆盖索引不需要回表,直接在索引中就可以查询到字段数据。
9.避免使用in,not in,>,<等范围查找,特别是组合索引最左边的列。
10.适当的为查询条件字段加索引,优化锁,避免加表级锁。
select * from t_goods where status=1 for update; //status如果建立了索引加行级锁,没有索引且不是主键加表级锁