如何查詢MySQL中查詢慢的SQL語句

2023-03-17 16:50:06 字數 1608 閱讀 8561

1樓:匿名使用者

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的效率?

mysql中的慢查詢會不會影響速度

2樓:愛可生雲資料庫

問題我們有一個 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資料查詢,mysql中如何查詢所有的表

使用hibernate查詢的話,你是用hql語句查詢麼?例如string hql from object o where o.id 查詢方法 session.createquery hql 或者直接session.get int id 如果不是這樣的語句,採用的是sql語句,例如string sql...

mysql優化查詢速度,如何優化Mysql執行查詢資料的速度

cus.fullname 不是group by的表示式啊 你確定你這sql能執行嗎?在已有的 mysql 伺服器之上使用 apache spark 無需將資料匯出到 spark 或者 hadoop 平臺上 這樣至少可以提升 10 倍的查詢效能。使用多個 mysql 伺服器 複製或者 percona ...

mysql如何查詢欄位中的資料是否包含於字串中

myid是什麼型別bai,是數值類 du型應這樣zhi寫 dao select from table where saleid 2376 and myid in 2,3,4,5,6 如果myid是字元型別,應版該這權 樣寫 select from table where saleid 2376 an...