MySQL學習之查詢順序是否會影響查詢效率


做為一個PHP開發者,關於MySQL的索引是面試時必問的問題

比如一條SQL查詢:

select * from userstatic where nick like "辛巴%" and rip=3726854906;

可能問到的問題有:

1、如果nick不是索引,rip是索引,這樣的條件順序會不會有問題?

     這個問題比較簡單,MySQL本身會對條件和索引進行判斷,這樣寫可以用到索引,沒有問題。

2、如果nick和rip都是索引,這樣寫有沒有問題?

     我們都知道,一次查詢只能使用一個索引,到底怎么使用索引呢?

     網上很多的答案告訴我們,如果兩個字段都建立了索引,會首先匹配左邊的字段,即nick,那么答案就明顯了,估計nick和rip可能影響的行數,哪個字段影響的行數少,即區分度大就寫在左邊。

     到底是不是這樣呢?首先我們把nick和rip都設為索引, 用explain來看一下:

在key列,我們可以看到用到nick做為索引,看上去沒有什么問題,換個順序試試:

 還是用nick做為索引,和我們想的不太一樣。

到底為什么呢,我試着分析一下,首先我們看這兩個字段單獨做為條件時結果有多少行:

nick可能影響的行數為7行(rows列不是一個精確值)

rip可能影響的行數為181行,那會不會和這個有關系呢?我們換一個值來看一下:

這次rip可能影響1行,比nick可能影響的行數少,再來看一下兩個條件都用到的時候:

這次用到的索引是rip。

那么我們可以得出結論:書寫SQL語句的時候,我們不用在意條件的前后順序,MySQL在查找的時候會進行優化。

 

那如果兩個字段都不是索引呢?

 有人說按照條件的先后順序遍歷全表,找到符合第一個條件的集合,再去找符合第二個條件的。(真是害死人)

 

來做個題目試試:

$data = [
    ['age' => 10, 'sex' =>'男'],
    ['age' => 20, 'sex' =>'女'],
    ['age' => 30, 'sex' =>'男'],
    ['age' => 40, 'sex' =>'女'],
    ['age' => 50, 'sex' =>'男'],
    ];
//要求:找到age>30的男人
//解法一
$res = $tmp = [];
foreach ($data as $k=>$v) {
    if ($v['age'] > 30) {
        $tmp[] = $v;
    }
}
if (!empty($tmp)) {
    foreach($tmp as $k=>$v) {
        if ($v['sex'] == '男') {
            $res[] = $v;
        }
    }
}
print_r($res);

//解法二
$res = [];
foreach ($data as $k=>$v) {
    if ($v['age'] > 30 && $v['sex'] == '男') {
        $res[] = $v;
    }
}
print_r($res);

誰都知道是解法二更好,難道你懷疑MySQL的那么一群大牛會使用解法一嗎?

 


免責聲明!

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



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