mysql 查詢慢的問題
1樓:愛可生雲資料庫
問題。我們有乙個 sql,用於找到沒有主鍵 / 唯一鍵的表,但是在 mysql 上執行特別慢,怎麼辦?
實驗。我們搭建乙個 mysql 的環境,此處省略搭建步驟。
寫個簡單的指令碼,製造一批帶主鍵和不帶主鍵的表:
執行一下指令碼:
現在執行以下 sql 看看效果:
執行了 ,感覺是非常慢了。
現在用一下 dba 三板斧,看看執行計劃:
感覺有點慘,由於 information_ 是後設資料表,沒有必要的統計資訊。
那我們來 show warnings 看看 mysql 改寫後的 sql:
我們格式化一下 sql:
可以看到 mysql 將。
select from a where not in (select x from b) /非關聯子查詢。
轉換成了。select from a where not exists (select 1 from b where = /關聯子查詢。
如果我們自己是 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 能先"快取"子查詢的結果(快取這一步叫物化,materialization),但mysql 認為不快取更快,我們就需要給予 mysql 一定指導。
可以看到執行時間變成了 。
1. 對於 information_schema 中的後設資料表,執行計劃不能提供有效資訊。
2. 通過檢視 mysql 改寫後的 sql,我們猜測了優化器發生了誤判。
3. 我們增加了 hint,指導 mysql 正確進行優化判斷。
但目前我們的實驗僅限於猜測,猜中了萬事大吉,猜不中就無法做出好的診斷。
如何查詢MySQL中查詢慢的SQL語句
問題我們有乙個 sql,用於找到沒有主鍵 唯一鍵的表,但是在 mysql 上執行特別慢,怎麼辦?實驗我們搭建乙個 mysql 的環境,此處省略搭建步驟。寫個簡單的指令碼,製造一批帶主鍵和不帶主鍵的表 執行一下指令碼 現在執行以下 sql 看看效果 執行了 感覺是非常慢了。現在用一下 dba 三板斧,...
mysql中10萬條記錄查詢慢的解決辦法?
如果ware type選擇性比較高 即每個ware type的記錄在總記錄數占比比較小 的話,可以考慮在ware type上建索引。十萬條資料已經夠多了,通常最好的辦法就是建立索引,建立索引的命令 create index index name on table name index col nam...
SQL資料庫怎麼實現模糊查詢,請問如何在SQL語句中實現模糊查詢?
實現的方法和詳細的操作步驟如下 1 第一步,按 ctrl n 建立乙個sql查詢,如下圖所示,然後進入下一步。2 其次,完成上述步驟後,可以使用 create database 關鍵字來進行建立,如下圖所示,然後進入下一步。3 接著,完成上述步驟後,輸入新建立的資料庫的名稱,如下圖所示,然後進入下一...