mysql 優化,代替in的好方法


文章轉自http://www.ttlsa.com/mysql/mysql-sql-performance-let-you-head-big-open/

今天看了一篇文章,講述了使用in在某些情況下的缺陷,然后作者通過union生成臨時表解決了這個問題,感覺這個優化特別好,和大家分享一下

由於分庫分表的原因,和開發規定了不能使用 表表JOIN 語句。因此,我們要將 JOIN 語句的轉化成使用 IN 來做。如現在有 表 A(a_id, c_a)c_a有普通索引,表 B(b_id, c_a) 這兩個表要關聯, 應該轉化為以下步驟處理:

  • 先查詢B中的 a_id

 

 

  • 使用 IN 查詢 A 表

 

 

場景

現在表的數據量有 800萬。

一般的使用語句是:

上面語句會執行的很快,知道使用 explain 的都明白這樣一般都是會使用索引的,並且是所有范圍掃描。

MySQL不會從 1 開始 掃描 800萬,而是從555555 掃描到 555559(只要掃描5行數據)。

在一般情況下是沒有什么問題的。但是如果 IN 里面的數據是不連續的就有很大問題了

創建表結構語句

 

 

下面是具體的實驗過程

  • 使用IN查詢連續的數

 

 

  • 使用IN查詢不連續的數

 

 

  • 使用UNION優化

 

從上面可以看出上面使用UNION的方法生成一個臨時表作為關聯的主表

拓展

要是MySQL有只帶的一個行轉列的函數那就完美了。這樣我們就可以不用使用UNION了。

要是能像上面就太棒了簡直。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM