我有以下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首先做索引的交集。任何人有任何想法如何?
非常感謝!
但是,既不是m_id也不是i_id unique/primary,而是對它們使用了index_merge。任何人都知道爲什麼? – diemacht 2012-02-21 09:34:48