由于工作中发生了这个问题,产生的影响比较大,而且也为了强化自己对于这次问题的印象以及处理方法,总结一下。
1.问题的原因:
1. 一些表并没有加上索引。
2. 引擎错误。在一个经常进行写操作的表,使用的为Myisam引擎,正确的应该使用InnoDB。前者是在写操作少而有大量查询操作的表中使用的。
3. 有一些表中的数据使用逻辑删除,表中有大量无意义数据。
2.目前用的解决方法
1. 对于没有加上索引的表:
- 对于没有查询操作的sql,不处理
- 对于有查询操作的
- 将需要改善的sql语句复制到GUI工具,比如SQLYOG。将其中需要补充的参数用常量代替,用EXPLAIN 解释语句。如果发现查询结果的type字段中为ALL的,查看对应的表,并给连接的字段加上索引。
- 尽量不要使用IN和NOT IN
2. 对于引擎错误的
- 当时发现一个奇怪的问题。就是我在DELETE一个表中一条数据,居然需要查询全表,而且是加上的索引也没用,换成UPDATE操作也是如此。后来该表从MYISAM引擎换成INNODB,删除就是毫秒级别的了。
3. 表中无意义的数据过多。
- 完全无意义的数据因为前面的习惯,用了逻辑删除,导致数据过多。要区分删除的数据是否有用,如果有用也应该移到历史库
浙公网安备 33010602011771号