mysql查询优化实战案例【实例较长建议慢慢学习】.doc
《mysql查询优化实战案例【实例较长建议慢慢学习】.doc》由会员分享,可在线阅读,更多相关《mysql查询优化实战案例【实例较长建议慢慢学习】.doc(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1mysql 查询优化实战案例【实例较长,建议慢查询优化实战案例【实例较长,建议慢慢学习】慢学习】这篇文章主要给大家介绍了关于 MySQL 查询优化分析的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用 MySQL 具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧前言MySQL 是关系性数据库中的一种,查询功能强,数据一致性高,数据安全性高,支持二级索引。但性能方面稍逊于非关系性数据库,特别是百万级别以上的数据,很容易出现查询慢的现象。这时候需要分析查询慢的原因,一般情况下是程序员 sql 写的烂,或者是没有键索引,或者是索引失效等原因导致的。这时候 MySQL 提供的 E
2、XPLAIN 命令就尤其重要,它可以对 SELECT语句进行分析,并输出 SELECT 执行的详细信息,以供开发人员针对性优化.而且就在查询语句前加上 Explain 就成:2EXPLAIN SELECT*FROM customer WHERE id lt;100;准备首先需要建立两个测试用表及数据:CREATE TABLE customer(id BIGINT(20)unsigned NOT NULL AUTO_INCREMENT,name VARCHAR(50)NOT NULL DEFAULT#39;#39;,age INT(11)unsigned DEFAULT NULL,PRIMARY
3、 KEY(id),KEY name_index(name)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4INSERT INTO customer(name,age)VALUES(#39;a#39;,1);INSERT INTO customer(name,age)VALUES(#39;b#39;,2);INSERT INTO customer(name,age)VALUES(#39;c#39;,3);INSERT INTO customer(name,age)VALUES(#39;d#39;,4);INSERT INTO customer(name,age)VALU
4、ES(#39;e#39;,5);INSERT INTO customer(name,age)VALUES(#39;f#39;,6);INSERT INTO customer(name,age)VALUES(#39;g#39;,7);3INSERT INTO customer(name,age)VALUES(#39;h#39;,8);INSERT INTO customer(name,age)VALUES(#39;i#39;,9);CREATE TABLE orders(id BIGINT(20)unsigned NOT NULL AUTO_INCREMENT,user_id BIGINT(20
5、)unsigned NOT NULL DEFAULT 0,product_nameVARCHAR(50)NOT NULL DEFAULT#39;#39;,productor VARCHAR(30)NOT NULL DEFAULT#39;#39;,PRIMARY KEY(id),KEYuser_product_detail_index(user_id,product_name,productor)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4INSERT INTO orders(user_id,product_name,productor)VALUES(1,#39;p
6、1#39;,#39;WHH#39;);INSERT INTO orders(user_id,product_name,productor)VALUES(1,#39;p2#39;,#39;WL#39;);INSERT INTO orders(user_id,product_name,productor)VALUES(1,#39;p1#39;,#39;DX#39;);4INSERT INTO orders(user_id,product_name,productor)VALUES(2,#39;p1#39;,#39;WHH#39;);INSERT INTO orders(user_id,produc
7、t_name,productor)VALUES(2,#39;p5#39;,#39;WL#39;);INSERT INTO orders(user_id,product_name,productor)VALUES(3,#39;p3#39;,#39;MA#39;);INSERT INTO orders(user_id,product_name,productor)VALUES(4,#39;p1#39;,#39;WHH#39;);INSERT INTO orders(user_id,product_name,productor)VALUES(6,#39;p1#39;,#39;WHH#39;);INS
8、ERT INTO orders(user_id,product_name,productor)VALUES(9,#39;p8#39;,#39;TE#39;);EXPLAIN 输出格式EXPLAIN 命令的输出内容大致如下:mysql explain select*from customer where id=1G*1.row*id:15select_type:SIMPLEtable:customerpartitions:NULLtype:constpossible_keys:PRIMARYkey:PRIMARYkey_len:8ref:constrows:1filtered:100.00Ext
9、ra:NULL1 row in set,1 warning(0.00 sec)各列的含义如下:id:SELECT 查询的标识符.每个 SELECT 都会自动分配一个唯一的标6识符.select_type:SELECT 查询的类型.table:查询的是哪个表 partitions:匹配的分区 type:join 类型possible_keys:此次查询中可能选用的索引key:此次查询中确切使用到的索引.ref:哪个字段或常数与 key 一起被使用rows:显示此查询一共扫描了多少行.这个是一个估计值.filtered:表示此查询条件所过滤的数据的百分比extra:额外的信息接下来我们来重点看一下
10、比较重要的几个字段.select_typeSIMPLE mdash;mdash;简单的 select 查询,查询中不包含子查询或者UNIONPRIMARY mdash;mdash;查询中若包含任何复杂的子查询,最外层查询则被标记为 primaryUNION mdash;mdash;表示此查询是 UNION 的第二或随后的查询DEPENDENT UNION mdash;mdash;UNION 中的第二个或后面的查询语句,取决于外面的查询UNION RESULT mdash;mdash;从 UNION 表获取结果的 select 结果7DERIVED mdash;mdash;在 from 列表中包
11、含的子查询被标记为derived(衍生)MySQL 会递归执行这些子查询,把结果放在临时表里。SUBQUERY mdash;mdash;在 select 或 where 列表中包含了子查询DEPENDENT SUBQUERY mdash;mdash;子查询中的第一个 SELECT,取决于外面的查询.即子查询依赖于外层查询的结果.最常见的查询类别应该是 SIMPLE 了,比如当我们的查询没有子查询,也没有 UNION 查询时,那么通常就是 SIMPLE 类型,例如:mysql explain select*from customer where id=2G*1.row*id:1select_ty
12、pe:SIMPLEtable:customerpartitions:NULLtype:constpossible_keys:PRIMARYkey:PRIMARY8key_len:8ref:constrows:1filtered:100.00Extra:NULL1 row in set,1 warning(0.00 sec)如果我们使用了 UNION 查询,那么 EXPLAIN 输出 的结果类似如下:mysql EXPLAIN(SELECT*FROM customer WHERE id IN(1,2,3)-UNION-(SELECT*FROM customer WHERE id IN(3,4,5
13、);+-+-+-+-+-+-+-+-+-+-+-+-+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+-+-+-+-+-+-+-+-+-+-+-+-+9|1|PRIMARY|customer|NULL|range|PRIMARY|PRIMARY|8|NULL|3|100.00|Using where|2|UNION|customer|NULL|range|PRIMARY|PRIMARY|8|NULL|3|100.00|Using where|NULL|UNION R
14、ESULT|lt;union1,2|NULL|ALL|NULL|NULL|NULL|NULL|NULL|NULL|Using temporary|+-+-+-+-+-+-+-+-+-+-+-+-+3 rows in set,1 warning(0.00 sec)table表示查询涉及的表或衍生表typetype 字段比较重要,它提供了判断查询是否高效的重要依据依据.通过 type 字段,我们判断此次查询是 全表扫描 还是 索引扫描等.type 常用类型type 常用的取值有:system:表中只有一条数据.这个类型是特殊的 const 类型.const:针对主键或唯一索引的等值查询扫描,最多只
15、返回一行数据.10const 查询速度非常快,因为它仅仅读取一次即可.例如下面的这个查询,它使用了主键索引,因此 type 就是 const 类型的.mysql explain select*from customer where id=2G*1.row*id:1select_type:SIMPLEtable:customerpartitions:NULLtype:constpossible_keys:PRIMARYkey:PRIMARYkey_len:8ref:constrows:1filtered:100.00Extra:NULL1 row in set,1 warning(0.00 se
16、c)11eq_ref:此类型通常出现在多表的 join 查询,表示对于前表的每一个结果,都只能匹配到后表的一行结果.并且查询的比较操作通常是=,查询效率较高.例如:mysql EXPLAIN SELECT*FROM customer,order_info WHERE customer.id=order_info.user_idG*1.row*id:1select_type:SIMPLEtable:order_infopartitions:NULLtype:indexpossible_keys:user_product_detail_indexkey:user_product_detail_in
17、dexkey_len:314ref:NULLrows:9filtered:100.0012Extra:Using where;Using index*2.row*id:1select_type:SIMPLEtable:customerpartitions:NULLtype:eq_refpossible_keys:PRIMARYkey:PRIMARYkey_len:8ref:test.order_info.user_idrows:1filtered:100.00Extra:NULL2 rows in set,1 warning(0.00 sec)ref:此类型通常出现在多表的 join 查询,针
18、对于非唯一或非主键索引,或者是使用了 最左前缀 规则索引的查询.例如下面这个例子中,就使用到了 ref 类型的查询:13mysql EXPLAIN SELECT*FROM customer,order_info WHERE customer.id=order_info.user_id AND order_info.user_id=5G*1.row*id:1select_type:SIMPLEtable:customerpartitions:NULLtype:constpossible_keys:PRIMARYkey:PRIMARYkey_len:8ref:constrows:1filtered
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实例较长,建议慢慢学习 mysql 查询 优化 实战 案例 实例 建议 慢慢 学习
限制150内