-
問:我們有乙個 sql,用於查詢沒有主鍵和唯一鍵的表,但它在 mysql 上執行得很慢,我們該怎麼辦?
在實驗中,我們設定了乙個MySQL環境,這裡省略了構建步驟。
編寫乙個簡單的指令碼來製作一批帶主鍵和不帶主鍵的表:
執行以下指令碼:
現在執行以下 sql 檢視效果:
執行,感覺很慢。
現在我們用DBA三板斧頭,看一下執行計畫:
感覺有點苦,因為資訊是元資料表,沒有必要的統計資訊。
讓我們顯示警告並看一下 mysql 重寫後的 sql
讓我們格式化 sql:
你可以看到 mysql 會。
select from a where not in (select x from b) 是非關聯子查詢。
我轉換了它。 從不存在的地方選擇(從 B 中選擇 1,其中 = 關聯的子查詢。
如果我們自己是MySQL,我們可以在執行非關聯子查詢時使用乙個非常簡單的策略:
select from a where not in (select x from b where ..非關聯子查詢:1
掃瞄表B中的所有記錄,找到符合條件的記錄,將其儲存在臨時表C中,並建立索引2掃瞄表 A 中的記錄,將其與臨時表 C 中的記錄進行比較,並直接在索引中進行比較,而關聯子查詢需要迴圈迭代:
select from a where not exists (select 1 from b where = and ..關聯的子查詢掃瞄表 A 的每個記錄 RA:掃瞄表 B 以查詢滿足 RA 條件的第一條記錄。
顯然,關聯子查詢的掃瞄成本將高於非關聯子查詢的掃瞄成本。
我們希望MySQL能排在第一位"快取"子查詢的結果(快取這一步稱為物化),但是MySQL認為不快取更快,所以我們需要給MySQL一些指導。
可以看到執行時間變成了 。
1.對於資訊架構中的元資料表,執行計畫不提供有效資訊。
2.通過檢視 MySQL 重寫的 SQL,我們猜測優化器存在誤報。
3.我們新增了提示來指導 MySQL 做出正確的優化判斷。
但目前,我們的實驗僅限於猜測,如果我們猜對了,一切都會好起來的,如果我們猜不到,我們將無法做出好的診斷。
-
你這樣做真的很低效。 最好不要把所有領域都拿走,你必須根據自己的具體需求去做。
您希望從聯合查詢中獲得什麼結果? 是否有可能找出表A中未包含的資料?
房東:你的想法本身就錯了,使用資料庫最大的關鍵是資料庫能做什麼,不要輕易改變,你想要的那種結果,有必要嗎? 一點也不。 >>>More