mysql 建索引需要注意的问题


不要建索引

1.不要对数据量较少的表建索引。如果表中只有几百条数据则不需要建索引,因为索引也需要存储空间,需要创建和维护,当数据量比较少的时候,全表扫描可能比走索引还要快一些。

2.读少写多的表不要创建索引。因为写入一条数据需要维护索引,频繁写入的时候,维护索引也是巨大开销,影响写入速度。

3.在区分度较少的字段上不要建索引。比如性别字段、省份等值可枚举的字段,这种字段区分度不大,比如性别只有”男/女”,只能区分一般的数据,不适合做索引。要用区分度较大的字段做索引。

4.查询中很少使用到的列不要建索引。

需要建索引

1.读多写少的表可用建索引。索引就是为了加快查找速度,当对一个表频繁读取的时候,建立索引肯定会加快读取的速度。

2.查询中经常使用到的列需要建索引。比如经常出现在where子句中、order by、group by中。

建索引需要注意的问题

1.并不是建了索引就会走索引,有时候全表扫描会更快。比如在性别字段上建了索引,如果有1各男1000各女,查询性别=男的时候可能会走索引,但是查询性别=女的时候就会全表扫描了,查询引擎会根据查询计划来选择是否需要走索引,走哪个索引。

2.索引不要建太多。每各insert,update都需要维护索引,索引也需要占用物理空间,因此并不是索引越多越好,一般一张表不要超过6各索引。如果索引太多就需要考虑某些索引是否有必要,或者能否优化sql语句,减少索引。

3.建表的时候能使用数字类型的字段就使用数字类型。因为数字类型只需要比较一次,而字符串类型需要比较每个字符。

写sql语句需要注意的问题

1.不要在sql语句中使用null。如果在where子句中使用了null则mysql引擎会放弃使用索引而全部扫描。例如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0。

2.尽量不要使用!=和<,> ,会导致索引失效,全表扫描。

3.尽量少用in。in的数量如果很多(实测,大于300索引会失效)则会导致索引失效,如果in的内容是连续的,可用考虑使用between…and

4.where子句中不要对字段使用表达式或者函数,会使索引失效。

5.不要把模糊查询的’%’放在前面,会使索引失效。

6.永远不要用select * 。每个sql都要明确返回的字段,不需要的字段不要返回,就算要返回所有的字段也应该把所有字段都写出来而不要用代替,因为查询引擎需要解析,会消耗性能。

7.避免频繁创建和删除临时表。sql语句中尽量少产生临时表,临时表需要消耗系统性能。

8.尽量避免大事务,提高系统并发性。事务里面不要有查询操作,可用在事务外面把需要的数据查询好并且把需要创建的树生成好,确保事务中只会执行创建、更新操作。

9.一次查询不要返回太多数据。如果数据太多需要分页。

参考

【1】mysql中建立索引的一些原则


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录