做网站不给源码,上海互联网公司,wordpress tag导入,大学it网页制作教程烂sql不仅直接影响sql的响应时间#xff0c;更影响db的性能#xff0c;导致其它正常的sql响应时间变长。如何写好sql#xff0c;学会看执行计划至关重要。下面我简单讲讲mysql的执行计划#xff0c;只列出了一些常见的情况#xff0c;希望对大家有所帮助。测试表结构…烂sql不仅直接影响sql的响应时间更影响db的性能导致其它正常的sql响应时间变长。如何写好sql学会看执行计划至关重要。下面我简单讲讲mysql的执行计划只列出了一些常见的情况希望对大家有所帮助。测试表结构CREATE TABLE t1 (c1 int(11) NOT NULL DEFAULT 0,c2 varchar(128) DEFAULT NULL,c3 varchar(64) DEFAULT NULL,c4 int(11) DEFAULT NULL,PRIMARY KEY (c1),KEY ind_c2 (c2),KEY ind_c4 (c4)) ENGINEInnoDB DEFAULT CHARSETutf8CREATE TABLE t2 (c1 int(11) NOT NULL DEFAULT 0,c2 varchar(128) DEFAULT NULL,c3 varchar(64) DEFAULT NULL,c4 int(11) DEFAULT NULL,PRIMARY KEY (c1),KEY ind_c2 (c2)) ENGINEInnoDB DEFAULT CHARSETutf8CREATE TABLE t3 (c1 int(11) NOT NULL DEFAULT 0,c2 varchar(128) DEFAULT NULL,c3 varchar(64) DEFAULT NULL,c4 int(11) DEFAULT NULL,PRIMARY KEY (c1),KEY ind_c2 (c2)) ENGINEInnoDB DEFAULT CHARSETutf81.查看mysql执行计划explain select ......2.执行计划包含的信息(1).id含义指示select字句或操作表的顺序。eg1id相同执行顺序从上到下下面的执行计划表示先操作t1表然后操作t2表最后操作t3表。eg2若存在子查询则子查询(内层查询)id大于父查询(外层查询)先执行子查询。id越大优先级越高。(2).select_type含义select语句的类型类型a.SIMPLE查询中不包含子查询或者UNIONb.查询中若包含任何复杂的子部分最外层查询则被标记为PRIMARYc.在SELECT或WHERE列表中包含了子查询该子查询被标记为SUBQUERYd.在FROM列表中包含的子查询被标记为DERIVED(衍生)e.若第二个SELECT出现在UNION之后则被标记为UNION若UNION包含在 FROM子句的子查询中外层SELECT将被标记为DERIVEDf.从UNION表获取结果的SELECT被标记为UNION RESULTegid为1的table显示,表示结果来源于衍生表2。id为2表示子查询读取t3表id为3类型为union是union的第二个select最先执行id为NULL的类型为union result, 表示id为1的操作和id为3的操作进行结果集合并。执行顺序3-2-1-NULL(3).type含义获取记录行采用的方式亦即mysql的访问方式。a.ALLFull Table Scan MySQL将遍历全表以找到匹配的行b.indexFull Index Scanindex与ALL区别为index类型只遍历索引索引一般比记录要小。因为索引中含有c1查询c1,c2可以通过索引扫描实现。c.range索引范围扫描对索引的扫描开始于某一点返回匹配值域的行常见于between、等的查询备注range类型肯定是使用了索引扫描否则type为ALLd.ref非唯一性索引扫描返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找t2.c4为非唯一索引e.eq_ref唯一性索引扫描对于每个索引键表中只有一条记录与之匹配。常见于主键或唯一索引扫描t2.c1为主键索引主键索引也是唯一索引f.const、system当MySQL对查询某部分进行优化并转换为一个常量时使用这些类型访问。如将主键置于where列表中MySQL就能将该查询转换为一个常量system是const类型的特例当查询的表只有一行的情况下 使用system(4).possible_keys含义指出MySQL能使用哪个索引在表中找到行查询涉及到的字段上若存在索引则该索引将被列出但不一定被查询使用(5).key含义显示MySQL在查询中实际使用的索引若没有使用索引显示为NULL(6)key_len含义表示索引中使用的字节数可通过该列计算查询中使用的索引的长度(7)ref含义用于连接查询表示具体某个表的某列被引用(8)rows含义MySQL根据表统计信息及索引选用情况估算的找到所需的记录所需要读取的行数,这个值是不准确的只有参考意义。(9)Extra含义显示一些辅助的额外信息a.Using index,表示使用了索引b.Using where表示通过where条件过滤c.Using temporary表示使用了临时表常见于分组和排序d.Using filesort表示无法使用索引排序需要文件排序eg1:t1.c3列没有索引eg2使用索引列t1.c2