mysql优化篇(基于索引)( 二 )
2.2、语句分析当我们找到了我们的哪些慢查询后怎么去分析呢 , 当然是借助explain啦 , 当然还有个帅气的小伙伴 , show profile , 接下来我们就一一介绍 。
回到顶部
2.2.1、explain【mysql优化篇(基于索引)】1、explain可以用来干嘛呢?
- 可以知道表的执行顺序
- 在sql中哪些索引可以使用
- 在sql中哪些索引实际上被用
- 数据读取操作的的操作类型
- sql中的每个表有多少行数据被优化器查询
- 表之间的引用
2、explain怎么玩呢?
语法:explain +sql查询
explain select * from item_description td inner join (select * from item_general where item_id in (select item_id from item where item_id > 332604504321036693 and item_id < 332604504321036710)) tt on tt.item_id=td.item_id;文章插图
如上我们先看一个explain+sql;
下面看下explain的具体说明:
1、id:select查询的序号列 , 表示查询select语句中表的执行顺序
- 当id相同 , 则从上往下执行
- 如果id不同 , 则从大到小的顺序执行
- 如果id有相同的也有不同的 , 按照上面两个规则执行 , 先大到小 , 先上到下
- SIMPLE:表示简单查询 , 其中不包括连接查询和子查询;
- PRIMARY:表示主查询 , 或者是最外层的查询语句 , 最外层查询为PRIMARY , 也就是最后加载的就是PRIMARY;
- UNION:表示连接查询的第2个或后面的查询语句 ,不依赖于外部查询的结果集
- DEPENDENT UNION:连接查询中的第2个或后面的SELECT语句 , 依赖于外面的查询;
- UNION RESULT:连接查询的结果;
- SUBQUERY:子查询中的第1个SELECT语句;不依赖于外部查询的结果集
- DEPENDENT SUBQUERY:子查询中的第1个SELECT , 依赖于外面的查询;
- DERIVED:导出表的SELECT(FROM子句的子查询),MySQL会递归执行这些子查询 , 把结果放在临时表里 。
- DEPENDENT DERIVED:派生表依赖于另一个表
- MATERIALIZED:物化子查询
- UNCACHEABLE SUBQUERY:子查询 , 其结果无法缓存 , 必须针对外部查询的每一行重新进行评估
- UNCACHEABLE UNION:UNION中的第二个或随后的 select 查询 , 属于不可缓存的子查询
4、partitions:查询将从中匹配记录的分区 。 该值适用NULL于未分区的表
5、type:表示表的连接类型
- system:该表是仅有一行的系统表 。 这是const连接类型的一个特例
- const: 数据表最多只有一个匹配行 , 它将在查询开始时被读取 , 并在余下的查询优化中作为常量对待 。 const表查询速度很快 , 因为只读取一次,const用于使用常数值比较PRIMARY KEY或UNIQUE索引的所有部分的场合 。
- eq_ref:对于每个来自前面的表的行组合 , 从该表中读取一行,可以用于使用=运算符进行比较的索引列。 比较值可以是常量 , 也可以是使用在此表之前读取的表中列的表达式
- ref:对于来自前面的表的任意行组合 , 将从该表中读取所有匹配的行 , ref可以用于使用“=”或“<=>”操作符的带索引的列 。
- fulltext:使用FULLTEXT 索引执行联接
- ref_or_null:这种连接类型类似于ref , 但是除了MySQL还会额外搜索包含NULL值的行 。 此联接类型优化最常用于解析子查询
- index_merge:此联接类型指示使用索引合并优化 。 在这种情况下 , key输出行中的列包含使用的索引列表 , 并key_len包含使用的索引 的最长键部分的列表
- unique_subquery:类型替换 以下形式的eq_ref某些 IN子查询,unique_subquery 只是一个索引查找函数 , 它完全替代了子查询以提高效率 。
- index_subquery:连接类型类似于 unique_subquery 。 它代替IN子查询,但只适合子查询中的非唯一索引
- range:只检索给定范围的行 , 使用一个索引来选择行 。 key列显示使用了哪个索引 。 key_len包含所使用索引的最长关键元素 。 当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符用常量比较关键字列时 , 类型为range
- index:该index联接类型是一样的 ALL , 只是索引树被扫描 。 这发生两种方式:1、如果索引是查询的覆盖索引 , 并且可用于满足表中所需的所有数据 , 则仅扫描索引树 。 在这种情况下 , Extra列显示为 Using index , 2、使用对索引的读取执行全表扫描 , 以按索引顺序查找数据行 。Uses index没有出现在 Extra列中 。
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 优化|微软亚洲研究院发布开源平台“群策 MARO” 用于多智能体资源调度优化
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型
- 人工智能|人工智能只会“优化”,而人类可以“进化”
- 工艺|食用油你懂了吗?篇二谈谈加工工艺
- 腔体|发烧音频速报 篇七十二:五百元价位标杆产品,Whizzer威泽Kylin HE01双腔体动圈耳机
- pymysql 连接 MySQL 实现简单登录
- 极致优化 IDEA 启动速度(本文内容过于硬核)
- 使用百度资源平台数据可以挖掘出哪些适合优化的有价值的关键
- D3学习手记 - 02 - 数据绑定