理论知识
-
MySQL 的运行机制
-
Mysql 的SQL关键字执行顺序
1、MySQL 的优化方案有哪些?
-
MySQL 数据库常见的优化手段分为三个层面:SQL 和索引优化、数据库结构优化、系统硬件优化等。
前两个可以通过日常的书写sql来实现,养成好的习惯可以事半功倍。 -
SQL 和索引优化习惯准则:
- 习惯1:我们应该尽可能的使用主键查询,而非其他索引查询,因为主键查询不会触发回表查询,因此节省了一部分时间,变相的提高了查询的性能。
- 习惯2:避免在 where 查询条件中使用 != 或者 <> 操作符,因为这些操作符会导致查询引擎放弃索引而进行全表扫描。
- 习惯3:(查询具体的字段而非全部字段)
要尽量避免使用 select *,而是查询需要的字段,这样可以提升速度,以及减少网络传输的带宽压力。 - 习惯4:(优化子查询)
尽量使用 Join 语句来替代子查询,因为子查询是嵌套查询,而嵌套查询会新创建一张临时表,而临时表的创建与销毁会占用一定的系统资源以及花费一定的时间,但 Join 语句并不会创建临时表,因此性能会更高。 - 习惯5:(注意查询结果集)
我们要尽量使用小表驱动大表的方式进行查询,也就是如果 B 表的数据小于 A 表的数据,那执行的顺序就是先查 B 表再查 A 表。 - 习惯6:(不要在列上进行运算操作)
不要在列字段上进行算术运算或其他表达式运算,否则可能会导致查询引擎无法正确使用索引,从而影响了查询的效率。 - 习惯7:(适当增加冗余字段)
增加冗余字段可以减少大量的连表查询,因为多张表的连表查询性能很低,所有可以适当的增加冗余字段,以减少多张表的关联查询,这是以空间换时间的优化策略。
-
数据库结构优化习惯准则
-
习惯1:(最小数据长度)
一般说来数据库的表越小,那么它的查询速度就越快,因此为了提高表的效率,应该将表的字段设置的尽可能小,比如身份证号,可以设置为 char(18) 就不要设置为 varchar(18)。 -
习惯2:(使用最简单数据类型)
能使用 int 类型就不要使用 varchar 类型,因为 int 类型比 varchar 类型的查询效率更高。 -
习惯3:(尽量少定义 text 类型)
text 类型的查询效率很低,如果必须要使用 text 定义字段,可以把此字段分离成子表,需要查询此字段时使用联合查询,这样可以提高主表的查询效率。 -
习惯4:(适当分表、分库策略)
分表和分库方案也是我们经常说的垂直分隔(分表)和水平分隔(分库)。
-
2、正确使用联合索引
使用了 B+ 树的 MySQL 数据库引擎,比如 InnoDB 引擎,在每次查询复合字段时是从左往右匹配数据的,因此在创建联合索引的时候需要注意索引创建的顺序。例如,我们创建了一个联合索引是 idx(name,age,sex),那么当我们使用,姓名+年龄+性别、姓名+年龄、姓名等这种最左前缀查询条件时,就会触发联合索引进行查询;然而如果非最左匹配的查询条件,例如,性别+姓名这种查询条件就不会触发联合索引。
-
慢查询排查
慢查询通常的排查手段是先使用慢查询日志功能,1.查询出比较慢的 SQL 语句,2.然后再通过 explain 来查询 SQL 语句的执行计划,最后分析并定位出问题的根源,再进行处理。 -
配置开启说明(需要注意的是,在开启慢日志功能之后,会对 MySQL 的性能造成一定的影响,因此在生产环境中要慎用此功能)
我们需要配置 my.cnf 中的“slow_query_log=1”即可,并且可以通过设置“slow_query_log_file=/tmp/mysql_slow.log”来配置慢查询日志的存储目录,但这种方式配置完成之后需要重启 MySQL 服务器才可生效。
具体查询可以通过mysql的Explain执行计划来排查
3、附Explain参数说明
以上字段中最重要的就是 type 字段,它的所有值如下所示:
特别注意:当 type 为 all 时,则表示全表扫描,因此效率会比较低,此时需要查看一下为什么会造成此种原因,是没有创建索引还是索引创建的有问题?以此来优化整个 MySQL 运行的速度。
更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取: