我有一个带有主键的Job表和几个与日期相关的字段......
+------------------+---------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+---------------+------+-----+-------------------+----------------+ | jobId | bigint(20) | NO | PRI | NULL | auto_increment | | creationDateTime | datetime | NO | MUL | NULL | | | lastModified | timestamp | NO | MUL | CURRENT_TIMESTAMP | | +------------------+---------------+------+-----+-------------------+----------------+
此表有426,579行和以下索引
+---------+------------+--------------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +---------+------------+--------------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+ | Job | 0 | PRIMARY | 1 | jobId | A | 439957 | NULL | NULL | | BTREE | | | Job | 1 | Job_lastModified_idx | 1 | lastModified | A | 439957 | NULL | NULL | | BTREE | | | Job | 1 | Job_creationDateTime_idx | 1 | creationDateTime | A | 439957 | NULL | NULL | | BTREE | | +---------+------------+--------------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+
现在是一个查询,例如......
select * from Job where jobId > 1000 and creationDateTime between '2011-09-07 18:29:24' and '2011-09-07 20:00:33';
按预期运行非常快(0s)
解释......
+----+-------------+-------+-------+----------------------------------+--------------------------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+----------------------------------+--------------------------+---------+------+------+-------------+ | 1 | SIMPLE | Job | range | PRIMARY,Job_creationDateTime_idx | Job_creationDateTime_idx | 8 | NULL | 39 | Using where | +----+-------------+-------+-------+----------------------------------+--------------------------+---------+------+------+-------------+
我看到针对lastmodified而不是creationDateTime
的等效查询的速度相同然而稍微复杂的查询......
select * from Job where jobId > 1000 and (lastModified between '2011-09-07 18:29:24' and '2011-09-07 20:00:33' or creationDateTime between '2011-09-07 18:29:24' and '2011-09-07 20:00:33');
运行缓慢(9秒)并且由于某种原因最终不得不进行更大的扫描,即使如此 按预期,它返回相同的行数(40)
+----+-------------+-------+-------+-------------------------------------------------------+---------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+-------------------------------------------------------+---------+---------+------+--------+-------------+ | 1 | SIMPLE | Job | range | PRIMARY,Job_lastModified_idx,Job_creationDateTime_idx | PRIMARY | 8 | NULL | 204581 | Using where | +----+-------------+-------+-------+-------------------------------------------------------+---------+---------+------+--------+-------------+
(注意:此表有426579行,因此不确定204581的来源)
我原以为这会同样快一点?
为什么MySQL在以这种方式编写时无法使用这些索引?
创建一些额外的复合材料索引lastModified& creationDateTime根本没有帮助。
create index test_idx1 on Job (lastModified,creationDateTime); create index test_idx2 on Job (jobId,lastModified,creationDateTime);
我一定错过了一些简单的事情?
答案 0 :(得分:1)
从@bill的引用看起来我们的mysql版本(5.0.67)不支持索引合并,所以在这种情况下没有索引会有所帮助。
我会选择一个快速的工会,谢谢大家!