2011-06-09 67 views
1

我有一個簡單的mysql表,我想用於日常的狀態跟蹤。在將一些信息放入其中並對測試結果進行測試後,我將使用它,它不會使用我的索引!我無法弄清楚爲什麼。爲什麼mySQL在我的測試查詢中不使用我的索引?

我試着放入更多的測試數據--200行。我也試着改變select *來選擇created,value1。沒有骰子。

mysql> show create table stat_general\G 
*************************** 1. row *************************** 
     Table: stat_general 
Create Table: CREATE TABLE `stat_general` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `nameid` smallint(6) NOT NULL, 
    `value1` int(11) NOT NULL, 
    `value2` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `created` (`created`,`nameid`,`value2`) 
) ENGINE=MyISAM AUTO_INCREMENT=49 DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

mysql> select * from stat_general; 
+----+---------------------+--------+--------+--------+ 
| id | created    | nameid | value1 | value2 | 
+----+---------------------+--------+--------+--------+ 
| 1 | 2011-06-09 09:43:41 |  1 | 511803 | NULL | 
| 2 | 2011-06-09 09:43:41 |  2 |  44 | NULL | 
| 3 | 2011-06-09 09:43:41 |  3 | 9128 | NULL | 
| 4 | 2011-06-09 09:43:41 |  4 | 219 | NULL | 
| 5 | 2011-06-09 09:43:41 |  5 |  0 | NULL | 
| 6 | 2011-06-09 09:43:41 |  6 |  0 | NULL | 
| 7 | 2011-06-09 09:43:41 |  7 |  0 | NULL | 
| 8 | 2011-06-09 09:43:41 |  8 |  0 | NULL | 
| 9 | 2011-06-09 09:43:41 |  9 |  0 | NULL | 
| 10 | 2011-06-09 09:43:41 |  10 | 140 | NULL | 
| 11 | 2011-06-09 09:43:41 |  11 |  0 | NULL | 
| 12 | 2011-06-09 09:43:41 |  12 | 146 | NULL | 
| 13 | 2011-06-09 09:43:41 |  13 |  0 | NULL | 
| 14 | 2011-06-09 09:43:41 |  14 |  1 | NULL | 
| 15 | 2011-06-09 09:43:41 |  15 | 8981 | NULL | 
| 16 | 2011-06-09 09:43:41 |  16 |  1 | -127 | 
| 17 | 2011-06-09 09:43:41 |  16 |  2 |  -2 | 
| 18 | 2011-06-09 09:43:41 |  16 | 939 |  -1 | 
| 19 | 2011-06-09 09:43:41 |  16 | 146 |  1 | 
| 20 | 2011-06-09 09:43:41 |  16 | 8011 |  3 | 
| 21 | 2011-06-09 09:43:41 |  16 |  28 | 127 | 
| 22 | 2011-06-09 09:43:41 |  16 |  1 | 128 | 
| 23 | 2011-06-09 09:43:41 |  17 | 146 |  1 | 
| 24 | 2011-06-09 09:43:41 |  18 | 146 |  1 | 
| 25 | 2011-06-09 09:44:08 |  1 | 511803 | NULL | 
| 26 | 2011-06-09 09:44:08 |  2 |  44 | NULL | 
| 27 | 2011-06-09 09:44:08 |  3 | 9128 | NULL | 
| 28 | 2011-06-09 09:44:08 |  4 | 219 | NULL | 
| 29 | 2011-06-09 09:44:08 |  5 |  0 | NULL | 
| 30 | 2011-06-09 09:44:08 |  6 |  0 | NULL | 
| 31 | 2011-06-09 09:44:08 |  7 |  0 | NULL | 
| 32 | 2011-06-09 09:44:08 |  8 |  0 | NULL | 
| 33 | 2011-06-09 09:44:08 |  9 |  0 | NULL | 
| 34 | 2011-06-09 09:44:08 |  10 | 140 | NULL | 
| 35 | 2011-06-09 09:44:08 |  11 |  0 | NULL | 
| 36 | 2011-06-09 09:44:08 |  12 | 146 | NULL | 
| 37 | 2011-06-09 09:44:08 |  13 |  0 | NULL | 
| 38 | 2011-06-09 09:44:08 |  14 |  1 | NULL | 
| 39 | 2011-06-09 09:44:08 |  15 | 8981 | NULL | 
| 40 | 2011-06-09 09:44:08 |  16 |  1 | -127 | 
| 41 | 2011-06-09 09:44:08 |  16 |  2 |  -2 | 
| 42 | 2011-06-09 09:44:08 |  16 | 939 |  -1 | 
| 43 | 2011-06-09 09:44:08 |  16 | 146 |  1 | 
| 44 | 2011-06-09 09:44:08 |  16 | 8011 |  3 | 
| 45 | 2011-06-09 09:44:08 |  16 |  28 | 127 | 
| 46 | 2011-06-09 09:44:08 |  16 |  1 | 128 | 
| 47 | 2011-06-09 09:44:08 |  17 | 146 |  1 | 
| 48 | 2011-06-09 09:44:08 |  18 | 146 |  1 | 
+----+---------------------+--------+--------+--------+ 
48 rows in set (0.00 sec) 

mysql> select * from stat_general where created>'2011-06-09 9:44' AND nameid=1; 
+----+---------------------+--------+--------+--------+ 
| id | created    | nameid | value1 | value2 | 
+----+---------------------+--------+--------+--------+ 
| 25 | 2011-06-09 09:44:08 |  1 | 511803 | NULL | 
+----+---------------------+--------+--------+--------+ 
1 row in set (0.00 sec) 

mysql> explain select * from stat_general where created>'2011-06-09 9:44' AND nameid=1; 
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+ 
| id | select_type | table  | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE  | stat_general | ALL | created  | NULL | NULL | NULL | 48 | Using where | 
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

回答

3

兩個原因:

首先,你的表是太小了。有了這幾行,無論查詢如何,打開整個表格並逐行篩選行速度都會更快。

接下來,即使您有更多行的數據非常相似,您的當前索引也不夠有選擇性。在這種情況下,不值得隨意打開磁盤頁面;按順序打開它們並將無效行過濾出來會更快。

+0

所以我猜這只是我的測試數據很差的功能。在現實世界中,我每天會有一行nameid = 1-18,可能是一年的數據。我可能會抽出最後3周來獲得特定的統計數據。 – dereferenced 2011-06-09 15:14:19

+0

在這種情況下,它將使用索引,除非它檢索大量的行。 – 2011-06-09 15:18:14

+0

我把一些更多的數據,現在它的工作。謝謝! – dereferenced 2011-06-09 15:23:56

0

只是爲了咧嘴笑...您的查詢主要基於給定的「nameID」或「Created」。如果填充NameID(即:發生了什麼特定的人),我將改變指數和標準

KEY `byName` (`nameid`,`created`,`value2`) 

然後將查詢到...

where nameid = 1 AND created > '2011-06-09 9:44' 

我還不能肯定,但如果該標準按照匹配索引的自然順序,它可能直接利用它與猜測索引...(特別是對於較大的數據集)...否則@Denis是正確的,它只是查詢數據頁面,因爲它很小,通過他們而不是試圖想到應該使用哪個索引。

+0

把更多的數據修復它。但是重新排列索引是個好主意。在我的查詢中,我將始終擁有一個nameid = X,但並不總是創建的(如果我想從所有時間抽取數據呢?)。我將重新安排索引。謝謝! – dereferenced 2011-06-09 15:24:53

相關問題