2010-06-30 39 views
2

好了,所以我有一個SQL查詢的位置:MySql使用主索引而不是多列第一列!

SELECT a.id,... FROM article AS a WHERE a.type=1 AND a.id=3765 ORDER BY a.datetime DESC LIMIT 1 

我希望得到按國家和id確切的文章,並與兩列類型和ID該索引創建的。 Id也是主鍵。 我使用了EXPLAIN關鍵字來查看使用了哪個索引,而不是使用主鍵索引的多列索引,但是我在創建索引時確實按順序設置了哪些東西。

MySQL是否使用主鍵索引而不是多列索引,因爲主鍵更快?或者我應該強制MySql使用多列索引?

P.S.剛注意到當有1個結果行時,使用順序是愚蠢的。哈哈。它增加了搜索時間0.0001秒。 :P

回答

3

我不知道,但我會認爲主鍵索引是最快的。如果是,使用任何其他索引都沒有多大用處。你要麼有一個ID爲3765的文章,要麼你沒有。掃描該單行以確定類型是否匹配是微不足道的。

如果您只返回一行,那麼您的ORDER BY子句沒有意義。並且a.type = 1的唯一一點是如果類型不正確,則拒絕具有正確標識的文章。

+0

我說過之後就想到了它,而且它使用主鍵似乎是合乎邏輯的。謝謝! :) – Rihards 2010-06-30 17:12:37

0

主鍵是唯一的,所以不需要MySQL檢查任何其他索引。 a.id=3765保證返回的行不會超過一行。如果該行的a.type=1爲false,則不會返回任何內容。

1

MySQL允許每個表最多有32個索引,每個索引最多可以包含16個列。多列/組合索引被視爲包含通過連接索引列值創建的值的有序數組。 MySQL使用多列索引的方式是,即使您沒有爲其他列指定值,您在WHERE子句中爲索引的第一列指定已知數量時,查詢也會很快。

如果您仔細查看MySQL如何使用索引,您會發現索引用於快速查找具有特定列值的行。如果沒有索引,MySQL必須從第一行開始,然後讀取整個表以查找相關行。

在MySQL中,爲了提高效率,主鍵列被自動索引,因爲它們使用MySQL的內置AUTO_INCREMENT功能。另一方面,人們不應該過分追求索引。雖然它提高了從數據庫中讀取數據的速度,但它減緩了數據庫中數據更改的過程(因爲這些更改需要記錄在索引中)。索引是最好的列上使用: -

  • 那些經常在查詢
  • 那些經常在ORDER使用查詢的一部分的WHERE部分使用
  • 有許多不同的值(列有許多重複值不應被索引)。

所以我嘗試使用主鍵如果我的查詢可以滿足它的使用。當&只有當需要更多這樣的索引&獲取記錄的牢固度時,才使用複合索引。

希望它有幫助。