2012-02-16 10 views
1

私は、次のMySQLのテーブル(テーブルサイズ - 周り10Kレコード)を持っている:あなたが見ることができるINTEGERフィールドとFLOATフィールドのMySQL交差キーの作成方法は?

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; 

として、私は2つの整数フィールド(R_IDとM_ID)と1つのFLOATフィールド(価格を)持っています。 これらのフィールドにはそれぞれインデックスがあります。

さて、私は最初の整数に2つ目の上の条件でクエリを実行すると、すべてが正常である:

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)を追加フィールドに入力します。 私は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はインデックスの結果と交差することを拒否します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がインデックス上で交差を行う必要があります。誰もどのように考えている?

ありがとうございます! MySQL manualから

答えて

0

refは、キーの用途に参加するだけ左端の接頭辞場合や が参加した場合、キーは、他の言葉で(PRIMARY KEYまたはUNIQUEインデックスではありません 場合に使用されますキー値に基づいて単一の行を選択することはできません)。使用されるキー がわずか数行と一致する場合、これは良好な結合タイプです。

priceは一意ではないため、refが選択されます。私はあなたが交差を強制することはできないと信じています。

+0

しかし、m_idもi_idも一意ではなく/主ではありませんが、index_mergeは使用されていません。なぜ誰が知っていますか? – diemacht

関連する問題