私は、次の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から
しかし、m_idもi_idも一意ではなく/主ではありませんが、index_mergeは使用されていません。なぜ誰が知っていますか? – diemacht