2009-12-09 19 views
2

我在表中有一列「名稱」,並且至少有1000萬條記錄。我在這個名稱列上添加了一個索引。現在,對於最初的幾次搜索,返回單個答案(無論名稱是否存在)需要超過10秒的時間,但突然間,它在不到0.1秒的時間內給出結果。我錯過了什麼嗎?我知道MySQL維護最近的查詢的緩存,但我所嘗試的查詢是非常隨機的...任何想法,爲什麼發生這種情況?使用MySQL觀察到奇怪的事情......查詢突然變得超快

+0

定義「相當隨意」 - 它很可能是你的查詢有足夠的非隨機的,經過第一很少,很多你的結果集已被帶入內存,所以查詢會更快。 – lawrence 2009-12-09 01:07:23

+0

呃...非常隨意的只是輸入我想到的任何東西。對不起...除此之外,我沒有真正使用正式的隨機性測試... – Legend 2009-12-09 01:15:52

回答

4

您的查詢簡單地暖索引緩存。這與查詢緩存無關。由於InnoDB索引的索引基數值不存儲在表文件中,因此InnoDB索引尤其需要一些命中預熱。初始查詢將使用它們遇到的索引數據來突出InnoDB緩衝池,這些數據由my.cnf中的innodb_buffer_pool_size指定的值定義。雖然對於MyISAM表不重要,但key_buffer_size的值可以進行類似的調整。

MySQL的InnoDB的性能tunning本章提供了一個很好的切入點進入弄清楚是怎麼回事: http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html

0

索引用於快速查找具有特定列值的行。如果沒有索引,MySQL必須從第一行開始,然後讀取整個表以查找相關行。表格越大,成本越高。如果表中有相關​​列的索引,MySQL可以快速確定在數據文件中間尋找的位置,而無需查看所有數據。如果一個表有1,000行,這比順序讀取至少快100倍。如果您需要訪問大多數行,順序讀取會更快,因爲這可以最大限度地減少磁盤搜索。

通過MySQL.com

+0

謝謝,但我的問題更多地瞭解添加索引後發生了什麼。我知道索引是如何工作的,但我對行爲的變化感到困惑。 – Legend 2009-12-09 01:06:16