文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL学习笔记(18):SQL优化

2016-01-24 12:26

关注

MySQL学习笔记(18):SQL优化

本文更新于2019-08-18,使用MySQL 5.7,操作系统为Deepin 15.4。

目录

通过SHOW STATUS了解SQL语句的执行情况

操作的计数,是对执行次数进行计数,不论提交还是回滚都会累加。

Com_xxx形式的参数表示每个xxx语句执行的次数,对所有的存储引擎都会进行累计,如:

Innodb_rows_xxx形式的参数只对InnoDB存储引擎进行累计,其累计的方式也与Com_xxx不同:

Handler_read_xxx形式的参数可表示索引的使用情况:

以下参数便于了解数据库的基本情况:

定位执行效率低下的SQL语句

通过EXPLAINDESC分析SQL的执行计划

DESCEXPLAIN分析SQL执行计划的使用和作用是一样的。

执行EXPLAIN statement后再执行SHOW WARNINGS,可以看到被优化器改写后真正执行的SQL。

一个执行计划包括若干行,每行包括如下的列:

通过SHOW PROFILESSHOW PROFILE分析SQL

profiling默认是关闭的,可通过设置变量@@profiling进行打开或关闭。

SHOW PROFILES结果包括以下字段:

SHOW PROFILE [ALL|CPU|{BLOCK IO}|{PAGE FAULTS}|SOURCE][, ...] FOR QUERY query_id(query_id为SHOW PROFILES结果的Query_ID字段)结果包括以下字段:

通过trace分析优化器如何选择执行计划

需打开trace,设置格式为JSON,设置trace最大能使用的内存大小。如:

SET @@optimizer_trace="enabled=on";
SET @@end_markers_in_json=on;
SET @@optimizer_trace_max_size=1000000;

执行SELECT * FROM information_schema.OPTIMIZER_TRACE即可得到结果。

ANALYZECHECKOPTIMIZEREPAIR执行期间都会对表进行锁定。

分析表,使得SQL能够生成正确的执行计划。如果感觉实际的执行计划并不符合预期,执行一次分析表可能会解决问题:

ANALYZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tablename[, ...]

检查表,用于检查表或视图是否有错误。如视图定义中被引用的表不存在:

CHECK TABLE tablename[, ...] [{QUICK|FAST|MEDIUM|EXTENDED|CHANGED}[ ...]]

优化表,可以将表中的空间碎片进行合并。如果已经删除表的很大一部分数据,或已经对含有可变长度行(含有VARCHAR*BLOB*TEXT的列)的表进行很多更改,则应该进行优化表:

OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tablename[, ...]

修复表,对坏表进行修复:

REPAIR [LOCAL|NO_WRITE_TO_BINLOG] TABLE tablename[, ...] [{QUICK|EXTENDED|USE_FRM}[ ...]]

大批量导入数据

对MyISAM存储引擎,可通过关闭和打开非唯一索引的更新提高导入效率:

ALTER TABLE tablename DISABLE KEYS;
# import data
ALTER TABLE tablename ENALBE KEYS;

对InnoDB存储引擎:

优化INSERT语句

优化ORDER BY语句

MySQL有两种排序方式:

对于filesort,MySQL比较查询取出的字段总大小和max_length_for_sort_data,判断使用哪种排序算法:

优化ORDER BY语句应该:尽量减少额外的排序,通过索引直接返回有序数据。WHERE条件和ORDER BY使用相同的索引,并且ORDER BY的顺序和索引顺序相同,并且ORDER BY的字段都是升序或都是降序。否则肯定需要额外的排序操作,这样就会出现filesort排序。

尽量SELECT必要的字段名,而不是SELECT *所有字段,这样可以减少排序区的使用,提高性能。

优化GROUP BY语句

MySQL会对GROUP BY的所有字段进行排序。如果想避免排序的消耗,可以使用ORDER BY NULL禁止排序。

优化子查询

有些情况下,子查询可以被更有效率的表连接代替。因为表连接不需要在内存中创建临时表。

优化OR条件

对于含有OR的查询,如果要利用索引,则OR之间的每个字段都必需能利用索引。此时,实际是对OR的各个字段分别查询的结果进行UNION操作。

优化分页查询

执行LIMIT offset_start, row_count时,MySQL排序出offset_start+row_count条记录后仅仅返回最后row_count条记录,前面的offset_start条记录都会被丢弃,查询和排序的代价非常高。有两种优化思路:

使用SQL提示

SQL提示(SQL HINT)就是在SQL语句中加入一些人为提示来达到优化的目的。

SELECT SQL_BUFFER_RESULT * FROM ...

这个语句强制MySQL生成一个临时结果集。生成后所有表上的锁均被释放,这能在遇到表锁问题或要花很长时间将结果传给客户端时有帮助。

SELECT * FROM tablename USE|IGNORE|FORCE INDEX (indexname[, ...]) WHERE ...

USE INDEX提供希望(实际执行时不一定会被选择)查询时使用的索引,IGNORE INDEX忽略指定的索引,FORCE INDEX强制使用指定的索引。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯