高效能MySql演化論 十 查詢優化器的侷限性

2021-08-27 15:50:35 字數 2299 閱讀 5035

在「查詢優化器常用的方式」一文中列出了一些優化器常用的優化手段。查詢優化器在提供這些特性的同時,也存在一定的侷限性,這些侷限性往往會隨著mysql版本的公升級而得到改善,所以本文會列出一些常見的侷限性,且不包含所有的。

描述:

因為select …from table1 t1 where t1.id in(select t2.fk from table2 t2 wheret2.id=』…』) 型別的語句往往會被優化成 select …. from table1 t1 where exists (select* from table2 t2 where t2.id=』…』 and t2.fk=t1.id), 由於在進行tabl2查詢時, table1的值還無法確定, 所以會對table1進行全表掃瞄

解決方案:

盡量用 inner join 替代 in(),重寫成 select * from table1 t1 inner jointable2 t2 using (id) where t2.id=』…』

描述:

union操作不會把union外的操作推送到每個子集

解決方案:

為每個子操作單獨的新增限制條件

例如 學生表有10000條記錄,會員表有10000表記錄,如果想按照姓名排序取兩個表的前20條記錄,如果在各個子查詢中新增limit的話,則最外層的limit操作將會從40條記錄中取20條,否則是從20000條中取20條

(select name from student order by name limit 20) union all (select name from memberorder by member limit 20) limit 20
在進行查詢操作的時候 in,on,using,等操作往往會把乙個列表的值在多個表之間共享,而優化器為了優化的方便會把列表裡的值為每個相關表都拷貝乙份,如果這個列表非常的大,會對效能造成一定的影響.

目前為止還沒有好的策略應對這個問題

目前為止,mysql不支援

目前mysql唯一支援的是迴圈巢狀關聯,不支援hash關聯

描述:所謂的鬆散索引就是當對表進行掃瞄是,可以智慧型的跳過一些記錄,以此來減少需要掃瞄的記錄行數.為了更清楚的說明這個問題,舉個例子來說明鬆散索引掃瞄的好處,例如table1表上有索引(a,b),執行 select * from tabl1 where b between2 and 3時,支援/不支援鬆散掃瞄的表掃瞄方式分別如下

由於b列是按照順序排列的,所以只需要在固定的區間內查詢就可以了,其餘的記錄可以跳過

b不是索引的第一字段,所以只能從第一條找到最後一條

上面兩個圖可以很明顯的說明鬆散索引的好處,但是mysql對這個特性的支援不是很好,只針對某些特殊的查詢才提供此優化,具體的要看各個版本的手冊

問題描述:

當執行 select max(id) from table1 where name=』sun』 時,如果name沒有建立相應的索引,mysql會進行全表掃瞄

解決方案:

將sql等同的轉化為

select id from table1 use index(primary) wherename=』sun』 limit 1.
這樣的語句會盡可能少的掃瞄表記錄

問題描述:

不能在查詢某個表的同時對錶進行更新

update table1t1 set  t1.cnt=(select count(*) fromtable1)
否則會丟擲異常: error 1093 (hy000): you can'tspecify target table 'ft***changerate' for update in from clause

解決辦法: 轉化成關聯表的形式

update ft***changerate 

inner join(

select currency,count(*) as cnt from ft***changerate group by (currency) ) as innusing(currency)

set ft***changerate.description=inn.cnt ;

高效能MySql演化論 十一 常見查詢語句的優化

高效能mysql演化論 十一 常見查詢語句的優化,總結一下常見查詢語句的優化方式。1.count的作用 count table.filed 統計的該字段非空值的記錄行數 count 或者是count not nullable field 統計的是全表的行數 如果要是統計全表記錄數,count 效率會...

高效能MySql演化論 八 表以及索引的維護

為了擁有高效能的資料庫,建立良好的表結構以及索引是必不可少的,與此同時對於表以及索引的維護也很重要 資料庫表損壞的原因很多,作業系統問題,硬體問題,或者是手工的修改了mysql的資料檔案,都會導致表的損壞。當出現問題時可能會導致查詢行為的異常,具體的異常行為在不同版本的資料庫中都不同。當發現資料庫的...

高效能MySql演化論 三 ID 標示符 的選擇

在設計資料庫表結構的時候,通常情況下每張表結構都有乙個字段作為id,因為 id會被用來做查詢,join,fk等操作,所以id設計的好壞對效能的影響很大。在為id選擇合適的型別的時候不僅需要考慮這種型別在資料庫中儲存所占用的空間,還需要考慮該型別在計算或者是值比較時的特性,例如bit型別儲存的時候是二...