explain 可以查看 SQL 執(zhí)行計(jì)劃,但是無法知道它為什么做這個(gè)決策次和,如果想確定多種索引方案之間是如何選擇的或者排序時(shí)選擇的是哪種排序模式。從 MySQL 5.6 開始,可以使用 trace 查看優(yōu)化器如何選擇執(zhí)行計(jì)劃曾雕。通過trace,能夠進(jìn)一步了解為什么優(yōu)化器選擇A執(zhí)行計(jì)劃而不是選擇B執(zhí)行計(jì)劃助被,或者知道某個(gè)排序使用的排序模式剖张,幫助我們更好地理解優(yōu)化器行為。
set session optimizer_trace="enabled=on",end_markers_in_json=on; ‐‐開啟trace
set session optimizer_trace=“enabled=off”; ‐‐關(guān)閉trace
SELECT * from user WHERE name like '張三%' ORDER BY code limit 100;
SELECT * FROM information_schema.OPTIMIZER_TRACE;
image.png
分析trace中的執(zhí)行計(jì)劃揩环∩ε可以有效分析建的索引為什么沒有走。查看優(yōu)化器如何選擇執(zhí)行計(jì)劃丰滑,獲取每個(gè)可能的索引選擇的代價(jià)顾犹。
TRACE 字段中整個(gè)文本大致分為三個(gè)過程。
準(zhǔn)備階段:對(duì)應(yīng)文本中的 join_preparation
優(yōu)化階段:對(duì)應(yīng)文本中的 join_optimization
執(zhí)行階段:對(duì)應(yīng)文本中的 join_execution
使用時(shí),重點(diǎn)關(guān)注優(yōu)化階段和執(zhí)行階段炫刷。
索引字段會(huì)作用在查詢和排序時(shí)擎宝,有排序字段時(shí)考慮跟查詢一塊建立組合索引