2012-02-16 40 views
1

我有以下MySQL表(表大小 - 10K左右的記錄):如何使MySQL與INTEGER字段和FLOAT字段的鍵相交?

CREATE TABLE `tmp_index_test` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `m_id` int(11) DEFAULT NULL, 
    `r_id` int(11) DEFAULT NULL, 
    `price` float DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `m_key` (`m_id`), 
    KEY `r_key` (`r_id`), 
    KEY `price_key` (`price`) 
) ENGINE=InnoDB AUTO_INCREMENT=16390 DEFAULT CHARSET=utf8; 

正如你所看到的,我有兩個整數字段(R_ID和M_ID)和一個FLOAT場(價格)。 對於這些字段中的每一個,我都有一個索引。

現在,當我運行的第一個整數和第二個條件的查詢時,一切都很好:

mysql> explain select * from tmp_index_test where m_id=1 and r_id=2; 
+----+-------------+----------------+-------------+---------------+-------------+---------+------+------+-------------------------------------------+ 
| id | select_type | table   | type  | possible_keys | key   | key_len | ref | rows | Extra          | 
+----+-------------+----------------+-------------+---------------+-------------+---------+------+------+-------------------------------------------+ 
| 1 | SIMPLE  | tmp_index_test | index_merge | m_key,r_key | r_key,m_key | 5,5  | NULL | 1 | Using intersect(r_key,m_key); Using where | 
+----+-------------+----------------+-------------+---------------+-------------+---------+------+------+-------------------------------------------+ 

好像MySQL能夠執行得很好,因爲在使用相交(r_key ,m_key)在Extra字段中。 我不是MySQL專家,但根據我的理解,MySQL首先在索引上創建交集,然後才從表本身收集交集的結果。

然而,當我運行非常相似的查詢,而是對兩個整數條件,我把類似的情況在整數和浮點數,MySQL的拒絕相交的指標結果:

mysql> explain select * from tmp_index_test where m_id=3 and price=100; 
+----+-------------+----------------+------+-----------------+-----------+---------+-------+------+-------------+ 
| id | select_type | table   | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+----------------+------+-----------------+-----------+---------+-------+------+-------------+ 
| 1 | SIMPLE  | tmp_index_test | ref | m_key,price_key | price_key | 5  | const | 1 | Using where | 
+----+-------------+----------------+------+-----------------+-----------+---------+-------+------+-------------+ 

正如你可以看到,MySQL只決定使用價格指數。

我的第一個問題是爲什麼,以及如何解決它?

除此之外,我需要使用MORE符號(>)而不是等號(=)在價格上運行查詢。目前解釋顯示,對於這樣的查詢,MySQL僅使用整數鍵。

mysql> explain select * from tmp_index_test where m_id=3 and price > 100; 
+----+-------------+----------------+------+-----------------+-------+---------+-------+------+-------------+ 
| id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+----------------+------+-----------------+-------+---------+-------+------+-------------+ 
| 1 | SIMPLE  | tmp_index_test | ref | m_key,price_key | m_key | 5  | const | 2 | Using where | 
+----+-------------+----------------+------+-----------------+-------+---------+-------+------+-------------+ 

我需要讓MySQL首先做索引的交集。任何人有任何想法如何?

非常感謝!

回答

0

MySQL manual:如果連接只使用關鍵的最左前綴,或者如果 的鍵不是PRIMARY KEY或唯一索引(換句話說,如果 加入

裁判用於不能根據鍵值選擇單個行)。如果使用的鍵 只匹配幾行,這是一個很好的連接類型。

price不是唯一的或主要的,所以選擇ref。我不相信你可以強制相交。

+0

但是,既不是m_id也不是i_id unique/primary,而是對它們使用了index_merge。任何人都知道爲什麼? – diemacht 2012-02-21 09:34:48

相關問題