連線資料庫
查詢快取,若命中直接返回結果(不推薦使用,更新即失效,利用效率低,8.0已經刪除查詢快取)
語法分析
語句優化
查詢儲存引擎
重建表方法:1. alter table t engine=innodb 2.optimize table t
analyze table t (只重建索引)
count(*)、count(主鍵 id)、count(字段) 和 count(1) 等不同用法的效能,有哪些差別
server 層要什麼就給什麼;
innodb 只給必要的值;
現在的優化器只優化了 count(*) 的語義為「取行數」,其他「顯而易見」的優化並沒有做。
對於 count(主鍵 id) 來說,innodb 引擎會遍歷整張表,把每一行的 id 值都取出來,返回給server 層。server 層拿到 id 後,判斷是不可能為空的,就按行累加。
對於 count(1) 來說,innodb 引擎遍歷整張表,但不取值。server 層對於返回的每一行,放乙個數字「1」進去,判斷是不可能為空的,按行累加。
count(1) 執行得要比 count(主鍵 id) 快。因為從引擎返回 id 會涉及到解析資料行,以及拷貝字段值的操作。
對於 count(字段) 來說:
如果這個「字段」是定義為 not null 的話,一行行地從記錄裡面讀出這個字段,判斷不能為 null,按行累加;
如果這個「字段」定義允許為 null,那麼執行的時候,判斷到有可能是 null,還要把值取出來再判斷一下,不是 null 才累加。
也就是前面的第一條原則,server 層要什麼字段,innodb 就返回什麼字段。
但是 count(*) 是例外,並不會把全部字段取出來,而是專門做了優化,不取值。count(*) 肯定不是 null,按行累加。
按照效率排序的話,count(字段)),所以我
建議你,盡量使用 count()。
查詢語句過慢
等待鎖等mdl鎖
等flush
等行鎖查詢慢
沒有索引需要掃瞄過多行
事務執行過程中,更新資料過多,需要查很久之前的檢視view
實戰mysql45講 MySQL實戰45講
作者簡介 林曉斌,網名 丁奇 前阿里資深技術專家,曾負責阿里雲rds核心開發團隊和運維團隊,並推動了alisql分支開源。作為活躍的mysql社群貢獻者,丁奇專注於資料儲存系統 mysql原始碼研究和改進 mysql效能優化和功能改進,熱衷於解決mysql疑難問題。課程亮點 你將獲得 前阿里資深技術...
mysql實戰45講筆記 07
07 行鎖功過 怎麼減少行鎖對效能的影響 mysql的行鎖是在引擎層由各個引擎自己實現的,不是所有資料庫都支援行鎖比如myisam 行鎖就是針對資料表中行記錄的鎖。在innodb事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻回訪,而是等到事務結束時才釋放,這就是兩階段鎖協議。因此,如果事...
最新MySQL實戰45講教程
目錄 01.基礎架構 一條sql查詢語句是如何執行的?html 01.基礎架構 一條sql查詢語句是如何執行的?01.基礎架構 一條sql查詢語句是如何執行的?pdf 02.日誌系統 一條sql更新語句是如何執行的?html 02.日誌系統 一條sql更新語句是如何執行的?02.日誌系統 一條sql...