mysql查询优化是个恒久的话题,也是面试和工作中常遇到的问题。 本人根据工作经验和学习知识,对mysql[查询]优化进行了归纳总结,分四个方面进行优化。
一、系统配置级别的优化
设计mysql的大叔们为我们的mysql预留了几百个可配置的系统变量,这么多的系统变量可以通过:
show variables [like] [模糊匹配模式];
这样的语句来查询到;也可以通过:
set [global|session] 变量名 = 变量值;
这样的语句进行修改(修改之后,记得重启mysql进程哦,不然不会生效的!)。
例如:
# 查询系统变量
show varibales like '%long_query%';
# 设置系统变量的值
set global long_query_time = 3;
并非所有的配置都用于优化,只列举一些配置参数(具体每个配置都是干嘛的,有兴趣的同学可以上mysql官网查找学习):
| 参数名 | 描述 |
|---|---|
| max_connections | 最大连接数 |
| key_buffer_size | 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度 |
| sort_buffer_size | 每个需要进行排序的线程分配该大小的一个缓冲区 |
| innodb_buffer_pool_size | |
| innodb_thread_concurrency | |
| innodb_log_buffer_size | |
| innodb_log_file_size | |
| innodb_log_files_in_group | |
| read_buffer_size | |
| read_rnd_buffer_size | |
| bulk_insert_buffer_size | |
| innodb_stats_method | |
| innodb_stats_persistent | |
| innodb_stats_persistent_sample_pages | |
| innodb_stats_transient_sample_pages | |
| innodb_stats_auto_recalc | |
| optimizer_search_depth | |
| ... ... | ... ... |
除了配置参数,系统数据库mysql里面也有可以优化的地方。比如可以调节查询成本等等。
SHOW TABLES FROM mysql LIKE '%cost%';
# 记录了server层进行的一些操作所对应的成本常数
SELECT * FROM mysql.server_cost;
# 记录了在存储引擎层进行的一些操作所对应的成本常数
SELECT * FROM mysql.engine_cost;
# server_cost和engine_cost表中的数据是可以修改的,如下面操作语句:
# 第一步:
UPDATE mysql.server_cost SET cost_value = 0.4 WHERE cost_name = 'row_evaluate_cost';
# 第二步:让系统重新加载这个表的值
FLUSH OPTIMIZER_COSTS;
二、表结构级别的优化
- 使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob(索引扫描区间相关知识)
- 使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数(节省空间,有利于索引)
- 使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar(InnoDB行格式有关的知识,对相关字段的二级索引可能有利)
- 尽可能使用not null定义字段(InnoDB行格式有关的知识,对相关列的二级索引可能有利)
- 尽量少用text,非用不可最好分表(为了避免出现“溢出页”)
三、sql语句级别的优化
- 避免select *,将需要查找的字段列出来 (利好查询优化器相关算法)
- 使用limit对查询结果的记录进行限定(利好查询优化器相关算法)
- 使用连接(join)来代替子查询 (利好查询优化器相关算法)
- 拆分大的delete或insert语句 (请结合相关配置参数)
- ALL/ANY子查询转换为使用MAX(xxx)/MIN(xxx)相关的方式
- 建立正确的索引,正确的使用索引(这个就不多说了。有不会的,欢迎评论区留言讨论。)
- 好好学学EXPLAIN输出的内容
- 开启慢查询功能,分析慢查询(工具mysqldumpslow或者percona-toolkit)(这一项也算配置级别的优化吧) 😁😁
- ... ...
四、架构级别的优化
分区、分表、分库