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 正確進行優化判斷。
但目前我們的實驗僅限於猜測,猜中了萬事大吉,猜不中就無法做出好的診斷。
2樓:司馬刀劍
一、mysql資料庫有幾個配置選項可以幫助我們及時捕獲低效sql語句。
1,slow_query_log
這個引數設定為on,可以捕獲執行時間超過一定數值的sql語句。
2,long_query_time
當sql語句執行時間超過此數值時,就會被記錄到日誌中,建議設定為1或者更短。
3,slow_query_log_file
記錄日誌的檔名。
4,log_queries_not_using_indexes
這個引數設定為on,可以捕獲到所有未使用索引的sql語句,儘管這個sql語句有可能執行得挺快。
二、檢測mysql中sql語句的效率的方法。
1、通過查詢日誌。
(1)、windows下開啟mysql慢查詢。
mysql在windows系統中的配置檔案一般是是找到[mysqld]下面加上。
**如下。log-slow-queries = f:/mysql/log/
long_query_time = 2
(2)、linux下啟用mysql慢查詢。
mysql在windows系統中的配置檔案一般是是找到[mysqld]下面加上。
**如下。log-slow-queries=/data/mysqldata/
long_query_time=2
如何在mysql查詢效率慢的sql語句
3樓:鄔潔諶夢凡
:一、mysql資料庫有幾個配置選項可以幫助我們及時捕獲低效sql語句1,slow_query_log這個引數設定為on,可以捕獲執行時間超過一定數值的sql語句。2,long_query_.
mysql怎麼查詢比較耗時的sql語句
4樓:何彭真傲冬
如何查詢mysql中查詢慢的sql語句。
一、mysql資料庫有幾個配置選項可以幫助我們及時捕獲低效sql語句。
1,slow_query_log
這個引數設定為on,可以捕獲執行時間超過一定數值的sql語句。
2,long_query_time
當sql語句執行時間超過此數值時,就會被記錄到日誌中,建議設定為1或者更短。
3,slow_query_log_file
記錄日誌的檔名。
4,log_queries_not_using_indexes
這個引數設定為on,可以捕獲到所有未使用索引的sql語句,儘管這個sql語句有可能執行得挺快。
二、檢測mysql中sql語句的效率的方法。
1、通過查詢日誌。
(1)、windows下開啟mysql慢查詢。
mysql在windows系統中的配置檔案一般是是找到[mysqld]下面加上。
**如下。log-slow-queries
=f:/mysql/log/
long_query_time=2
(2)、linux下啟用mysql慢查詢。
mysql在windows系統中的配置檔案一般是是找到[mysqld]下面加上。
**如下。log-slow-queries=/data/mysqldata/
long_query_time=2
mysql中10萬條記錄查詢慢的解決辦法?
如果ware type選擇性比較高 即每個ware type的記錄在總記錄數占比比較小 的話,可以考慮在ware type上建索引。十萬條資料已經夠多了,通常最好的辦法就是建立索引,建立索引的命令 create index index name on table name index col nam...
MySql多條件模糊查詢,mysql如何執行多條件的模糊查詢取交集的
select from 表 where 欄位一 like 搜尋詞 or 欄位二 like 搜尋詞 or 欄位三 like 搜尋詞 select bid,bname,publish,author,kind from book where delflag 0 and bname like 王 查詢bna...
mysql查詢未解碼的unicode漢字,模糊查詢不成功
mysql查詢的時候會將 乾掉,你可以用mysql的like萬用字元來做 like u5f20 u4e09 變成like u5f20 u4e09 試試把漢字前面那個 再轉義一下,應該就可以了。mysql查詢未解碼的unicode漢字,模糊查詢不成功怎麼辦?mysql查詢的時候會將 乾掉,你可以用my...