1、更合理的表设计
选择数据类型遵循小而简单的原则,越小的数据类型通常会更快,占用更少的磁盘、内存,处理时需要的CPU周期也更少。同时在建表的时候就设计好索引。
2、合理使用索引
索引是提高MySQL查询性能的一个重要途径,但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用,从而影响应用程序的整体性能。遵从索引的“最左原则”,使用复合索引而不是多个独立的索引。
不使用索引的情况应当避免:
- 在 where 子句中使用!=或<>操作符
- 在索引列上使用IS NULL和IS NOT NULL,不会使用索引
- 在 where 子句中使用 or 来连接条件
- 以%开头的like
- 查询数据类型出现隐式转换的时候也不会使用索引,特别是当列类型是字符串,那么一定记得在where条件中把字符串常量值用引号引起来,否则即便这个列上有索引,MySQL也不会用到,因为MySQL默认把输入的常量值进行转换以后才进行检索;
- 复合索引的情况下,如果查询条件不包含索引列的最左边部分,即不满足最左前缀原则,则不会使用索引;
- 用or分割开的条件,如果 or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到;
- 字段使用函数,将无法使用索引;
- Join 语句中 Join 条件字段类型不一致的时候 MySQL 无法使用索引。
- 避免多个范围条件
3、优化查询语句
- 查询的条件尽量使用索引字段,如某一个表有多个条件,就尽量使用复合索引查询,复合索引使用要注意字段的先后顺序。
- 多表关联尽量用join,减少子查询的使用。表的关联字段如果能用主键就用主键,也就是尽可能的使用索引字段。如果关联字段不是索引字段可以根据情况考虑添加索引。
- 尽量使用limit进行分页批量查询,不要一次全部获取。
- 绝对避免select *的使用,尽量select具体需要的字段,减少不必要字段的查询;
- 尽量将or 转换为 union all。
- 尽量避免使用is null或is not null。
- 用exists代替in,not exists代替not in
- 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序,总计等操作。
参考资料:
https://zhuanlan.zhihu.com/p/88619841
https://zhuanlan.zhihu.com/p/59818056 讲述了原理
https://blog.csdn.net/Soinice/article/details/84502292 一个略显重复的总结