2017-04-23 97 views
0

我有這樣的MySQL表:MySQL不使用SELECT ... ORDER BY查詢中的主鍵。爲什麼?

CREATE TABLE `maillog` (
    `Id` varchar(200) NOT NULL DEFAULT 'Test', 
    `email` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`Id`), 
    KEY `email` (`email`) 
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 ROW_FORMAT=DYNAMIC; 

現在,我想執行這個查詢 - 但它是非常緩慢的許多行:

SELECT Id FROM `maillog` ORDER BY `Id`; 

爲什麼MySQL的不使用主鍵?

如果我運行EXPLAIN此查詢,結果顯示Key一個NULL值:

mysql> EXPLAIN SELECT Id FROM `maillog` ORDER BY `Id`; 
+----+-------------+---------+------------+--------+---------------+------+---------+------+------+----------+-------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | 
+----+-------------+---------+------------+--------+---------------+------+---------+------+------+----------+-------+ 
| 1 | SIMPLE  | maillog | NULL  | system | NULL   | NULL | NULL | NULL | 1 | 100.00 | NULL | 
+----+-------------+---------+------------+--------+---------------+------+---------+------+------+----------+-------+ 

DESCRIBE查詢此表,顯示了KeyPRIId列:

mysql> DESCRIBE `maillog`; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| Id | varchar(200) | NO | PRI | Test |  | 
| email | varchar(255) | YES | MUL | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 
+0

MySQL的應該是使用此查詢的主鍵。 –

+0

@ GordonLinoff:我同意你的看法 - 但它不適用於不同的MySQL版本。 – Tahtu

+0

編輯問題並插入'explain'。 MySQL使用主鍵作爲聚集索引,因此在解釋使用密鑰時可能並不明顯。許多用戶的「長時間」可能僅僅是由於正在處理的數據量所致。 –

回答

0

我覺得你把主鍵空字符串設置爲默認是很奇怪的。 即使我不明白mySql如何允許它。 嘗試退出默認值,主鍵必須是強制性的。

+0

同樣的問題,如果我設置一個默認值。 – Tahtu

+0

「同樣的問題」然後標記爲解決方案。奇怪... –

+0

對不起,我的錯。 – Tahtu

0

你有只有1行在你的數據庫中,查詢引擎不會打擾加載索引,它只是對錶進行順序讀取,所以是「無索引」。

嘗試增加一些行,這種情況需要改變(1條maillog中的maillog2線,2):

SQL Fiddle

的MySQL 5.6架構設置

查詢1

explain SELECT Id FROM `maillog` ORDER BY `Id` 

Results

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
|----|-------------|---------|--------|---------------|--------|---------|--------|------|--------| 
| 1 |  SIMPLE | maillog | system |  (null) | (null) | (null) | (null) | 1 | (null) | 

查詢2

explain SELECT Id FROM `maillog2` ORDER BY `Id` 

Results

| id | select_type | table | type | possible_keys |  key | key_len | ref | rows |  Extra | 
|----|-------------|----------|-------|---------------|---------|---------|--------|------|-------------| 
| 1 |  SIMPLE | maillog2 | index |  (null) | PRIMARY |  202 | (null) | 2 | Using index | 
+0

I具有超過100.000行的「真實」表具有相同的問題。 – Tahtu

+0

@Tahtu你能向我們展示10萬行解釋嗎?因爲它真的看起來像我解釋的情況... – Blag

+0

我不能 - 我沒有那張桌子 - 我要求一個朋友。 – Tahtu