MySQL性能优化——Explain使用分析
执行计划是分析SQL性能的利器 , 目前互联网最常用的关系型数据库是MySQL , 接下来结合自己对MySQL的理解和实践经验谈谈MySQL执行计划的使用 。
简介
MySQL提供了explain语法 , 使用非常简单 , 例:EXPLAIN SELECT * from user_info WHERE id =2;
输出格式如下:
文章插图
执行结果
各列的含义:
- id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
- select_type: SELECT 查询的类型.
- table: 查询的是哪个表
- type: join 类型
- possible_keys: 此次查询中可能选用的索引
- key: 此次查询中确切使用到了索引.
- ref: 哪个字段或常数与 key 一起被使用
- rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
- filtered: 表示此查询条件所过滤的数据的百分比
- extra: 额外的信息
id:select 的查询序号 , 包括一组数字 , 表示查询中执行了子句或操作的顺序 。
id的查询结果有3种情况
- id相同 , 执行顺序自上而下
文章插图
执行结果
- id不同 , 如果是子查询 , id序号会递增 , id值越大 , 越先被执行
文章插图
执行结果
- id相同和不同同时存在 , id值越大 , 越先被执行 , id相同认为是同一组 , 自上而下执行 。 另外衍生=derived , 下图中在id=1时 , table显示的是derived2 , 指向id=2的表 , 即T3表的衍生表 。
文章插图
执行结果
select_type:表示查询的类型 , 取值如下:
- SIMPLE:表示此查询不包含 UNION 查询或子查询
- PRIMARY:表示此查询是最外层的查询
- UNION:表示此查询是 UNION 的第二或随后的查询
- DEPENDENT UNION:UNION 中的第二个或后面的查询语句, 取决于外面的查询
- UNION RESULT:UNION 的结果
- SUBQUERY:子查询中的第一个 SELECT
- DEPENDENT SUBQUERY:子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果.
如果使用了union查询 , EXPLAIN (SELECT * FROM user_info WHERE id IN (1, 2, 3)) UNION (SELECT * FROM user_info WHERE id IN (3, 4, 5));结果如下:
文章插图
执行结果
type:此属性比较重要 , 它提供了判断查询效率是否高效的依据 。
常用取值:
- system, 表中只有一条数据 。
- const , 针对主键或者唯一索引的等值查询 , 最多返回一行数据 , const查询效率高 。
- eq_ref , 多表join查询 , 使用主键或者唯一索引进行关联 , 通常使用“=”进行关联 , 查询效率高 。 explain SELECT * FROM user_info, order_info WHERE user_info.id = order_info.user_id;
文章插图
执行结果
- ref , 多表join查询 , 使用非唯一索引和非主键索引 , 或者使用最左前缀规则的查询 。 EXPLAIN SELECT * FROM user_info,order_info WHERE user_info.id = order_info.user_id AND order_info.user_id = 3;
推荐阅读
- 搭载骁龙888处理器+120W超充 横屏性能旗舰iQOO 7正式发布
- 不单性能一骑绝尘 iQOO 7的这些亮点也值得一提
- 骁龙888领衔 iQOO 7搭载新一代性能“铁三角”
- “性能旗舰”iQOO 7正式发布:感受全感操控3798元起
- 向日葵远程控制企业版客户端更新升级,优化远控UI适配SADDC内核算法
- 苹果两款新iPad齐曝光:性能提高、入门款更轻薄、售价便宜
- 发售仅7天,性能全国第一:华为、OV一起上,都不如这款手机?
- 视网膜优化?索尼具认知能力电视芯片XR来了
- 传统1/10大小 七彩虹发布最小的mini SSD硬盘:性能首次公开
- 荣耀v40pro对比vivox60pro哪个好区别在哪 性能谁更强