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 一个略显重复的总结