从哪些维度进行数据库调优
1.索引失效 没有充分利用索引
2.关联太多join (sql优化)
3.服务器调优和各个参数(缓存。线程池)
4.数据过多 --分库分表
sql优化分为物理查询优化和逻辑查询优化 屋里查询优化据说通过索引和表连接等方式进行优化
逻辑查询优化就是通过sql等价变换提升查询效率
1.索引失效
1.主键插入顺序
最好让插入的记录的 主键值依次递增 ,这样就不会发生这样的性能损耗了。
建议:让主键具有 AUTO_INCREMENT ,让存储引擎自己为表生成主键,而不是我们手动插入
2.最左前缀原则
索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。
3.计算、函数、类型转换(自动或手动)导致索引失效
4.类型转换导致索引失效
5.范围条件右边的列索引失效
6.不等于(!= 或者<>)索引失效
7.is null可以使用索引,is not null无法使用索引
8. like以通配符%开头索引失效
9.OR 前后存在非索引的列,索引失效
10.数据库和表的字符集统一使用utf8mb4
统一使用utf8mb4( 5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的 字符集 进行比较前需要进行 转换 会造成索引失效
join语句原理
1.
使用
join
语句,性能比强行拆成多个单表执行
SQL
语句的性能要好;
2.
如果使用
join
语句的话,需要让小表做驱动表。
排序优化
1. SQL 中,可以在 WHERE 子句和 ORDER BY 子句中使用索引,目的是在 WHERE 子句中 避免全表扫 描 ,在 ORDER BY 子句 避免使用 FileSort 排序 。当然,某些情况下全表扫描,或者 FileSort 排
序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。
2. 尽量使用 Index 完成 ORDER BY 排序。如果 WHERE 和 ORDER BY 后面是相同的列就使用单索引列;
如果不同就使用联合索引。
3. 无法使用 Index 时,需要对 FileSort 方式进行调优。
序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。
2. 尽量使用 Index 完成 ORDER BY 排序。如果 WHERE 和 ORDER BY 后面是相同的列就使用单索引列;
如果不同就使用联合索引。
3. 无法使用 Index 时,需要对 FileSort 方式进行调优。
总结
1.保证被驱动表的JOIN字段已经创建了索引
2.需要JOIN 的字段,数据类型保持绝对一致。
3.LEFT JOIN 时,选择小表作为驱动表, 大表作为被驱动表 。减少外层循环的次数。
4.INNER JOIN 时,MySQL会自动将 小结果集的表选为驱动表 。选择相信MySQL优化策略。
5.能够直接多表关联的尽量直接关联,不用子查询。(减少查询的趟数)
6.不建议使用子查询,建议将子查询SQL拆开结合程序多次查询,或使用 JOIN 来代替子查询。
7.衍生表建不了索引
2.需要JOIN 的字段,数据类型保持绝对一致。
3.LEFT JOIN 时,选择小表作为驱动表, 大表作为被驱动表 。减少外层循环的次数。
4.INNER JOIN 时,MySQL会自动将 小结果集的表选为驱动表 。选择相信MySQL优化策略。
5.能够直接多表关联的尽量直接关联,不用子查询。(减少查询的趟数)
6.不建议使用子查询,建议将子查询SQL拆开结合程序多次查询,或使用 JOIN 来代替子查询。
7.衍生表建不了索引