DTMySQL索引最佳实践赢在刘宏仓02MySQLEXPLAIN•EXPLAINSQL1.EXPLAINEXTENDEDSQL将执行计划“反编译”成SELECT语句,运行SHOWWARNINGS可得到被MySQL优化器优化后的查询语句2.EXPLAINPARTITIONSSQL用于分区表的EXPLAIN03MySQLEXPLAIN•EXPLAINRESULT1.ID:2.SELECT_TYPE3.TABLE4.TYPE5.POSSIBLE_KEYS6.KEY04MySQLEXPLAIN•EXPLAINRESULT7.KEY_LEN8.REF9.ROWS10.EXTRA05MySQLEXPLAIN•EXPLAINRESULTID:一组数字,表示执行SQL子句或操作表的顺序ID相同,执行顺序由上至下子查询中ID的序号会递增,id值越大优先级越高,越先被执行在所有组中,ID值越大,优先级越高,越先执行06MySQLEXPLAIN•EXPLAINRESULTSELECT_TYPE:表示查询中每个SQL子句的类型1SIMPLE2PRIMARY3SUBQUERY4DERIVED5UNION6UNIONRESULT简单复杂07MySQLEXPLAIN•EXPLAINRESULT1.SIMPLE:查询中不包含子查询或者UNION2.查询中若包含任何复杂的子查询,最外层查询被标记为:PRIMARY3.在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY4.在FROM列表中包含的子查询被标记为:DERIVED(虚拟)5.如果第二个SELECT出现在UNION之后,则被标记为UNION;如果UNION包含在FROM子句的子查询中外层SELECT将被标记为:DERIVED6.从UNION表获取结果的SELECT被标记为:UNIONRESULT08MySQLEXPLAIN•EXPLAINRESULTTABLE:显示所访问的数据库中的表名或别称09MySQLEXPLAIN•EXPLAINRESULTTYPE:表示MySQL在表中找到所需行的方式,又称访问类型,常见类型如下:ALL-INDEX-RANGE-REF-EQ_REF-CONST-SYSTEM-NULL低高10MySQLEXPLAINALL:FullTableScan,MySQL将遍历全表以找到匹配的行INDEX:FullIndexScan,index与ALL区别为index类型只遍历索引树RANGE:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、、等的查询REF:非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找EQ_REF:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描CONST:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量SYSTEM:是CONST特例,当查询的表只有一行的情况下使用systemNULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引11MySQLEXPLAIN•EXPLAINRESULTPOSSIBLE_KEYS:指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用12MySQLEXPLAIN•EXPLAINRESULTKEY:显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULLTIPS:查询中若使用了覆盖索引,则该索引仅出现在key列表中13MySQLEXPLAIN•EXPLAINRESULTKEY_LEN:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度key_len的长度计算公式:char(10)允许NULL=10*(characterset:utf8=3,gbk=2,latin1=1)+1(NULL)char(10)不允许NULL=10*(characterset:utf8=3,gbk=2,latin1=1)varchr(10)允许NULL=10*(characterset:utf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)varchr(10)不允许NULL=10*(characterset:utf8=3,gbk=2,latin1=1)+2(变长字段)int允许NULL=4+1(NULL)int不允许NULL=4timestamp允许NULL=4+1(NULL)timestamp不允许NULL=4datatime允许NULL=5+1(NULL)datatime不允许NULL=514MySQLEXPLAIN•EXPLAINRESULTREF:表示表之间的连接匹配条件,即哪些列或常量被用于查找索引列上的值ROWS:表示MySQL根据表统计信息及索引选用情况,估算找到所需的记录需要读取的行数15MySQLEXPLAIN•EXPLAINRESULTExtra:额外信息,不适合在其他列中显示但十分重要的信息16MySQLEXPLAIN1.Usingindex:该值表示相应的select操作中使用了覆盖索引2.Usingwhere:表示MySQL服务器在存储引擎收到记录后进行“后过滤”,如果查询未能使用索引,Usingwhere的作用只是提醒我们MySQL将用where子句来过滤结果集3.Usingtemporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询4.Usingfilesort:MySQL中无法利用索引完成的排序操作称为“文件排序”高低17MySQLPROFILESETPROFILING=ON开启SHOWPROFILES显示所有QUERY02MySQLPROFILESHOWPROFILEFOR3QUERY显示QUERY详情19MySQLPROFILESHOWPROFILECUP,BLOCKIOFOR3QUERY查询分析cpu,io,memory等使用情况21MySQLINDEX第二章节21You’veMadeaGreatChoice!•对于DBA和开发者来说学习索引非常重要•错误的索引选择是产品的最大隐患•构建索引不是什么高深技术22MySQLIndexing:Agenda•了解索引•在你的项目应用中构建最合适的索引•MySQL索引工作的局限性2017赢在THANKYOU刘宏仓