在MySQL中查询和使用索引的速度很慢

时间:2016-02-04 17:32:50

标签: mysql sql

我有以下查询:

SELECT final_query.chr
     , final_query.start
     , final_query.end
     , co.chr
     , co.start
     , co.end
     , final_query.count
FROM (SELECT ed.chr
     , ed.start
     , ed.end
     , case when e.bin1=ed.bin then e.bin2 else e.bin1 end AS target
     , count
     FROM (SELECT * FROM coordinates
     WHERE chr="chr1" AND (start between 3960000 AND 4000000 OR end between 3960000 AND 4000000)
     ) ed
     JOIN counts e ON (e.bin1 = ed.bin OR e.bin2=ed.bin)
     SORT BY count LIMIT 1,20)
AS final_query
JOIN coordinates co ON final_query.target=co.bin;

EXPLAINED的输出为:

+------+-------------+-------------+--------+---------------+---------+---------+-------+----------+------------------------------------+
| id   | select_type | table       | type   | possible_keys | key     | key_len | ref   | rows     | Extra                              |
+------+-------------+-------------+--------+---------------+---------+---------+-------+----------+------------------------------------+
|    1 | SIMPLE      | e           | ALL    | bin1,bin2     | NULL    | NULL    | NULL  | 30763816 | Using filesort                     |
|    1 | SIMPLE      | coordinates | ref    | PRIMARY,chr   | chr     | 22      | const |     4929 | Using index condition; Using where |
|    1 | SIMPLE      | co          | eq_ref | PRIMARY       | PRIMARY | 22      | func  |        1 | Using where                        |
+------+-------------+-------------+--------+---------------+---------+---------+-------+----------+------------------------------------+

我正在做的是对表coordinates执行以下查询,该表chr已编入索引。因此,在下面显示的子查询中,我会过滤那些符合我条件的行。

... (SELECT * FROM coordinates
     WHERE chr="chr1" AND (start between 3960000 AND 4000000 OR end between 3960000 AND 4000000)
) ...

此表输出也为索引的字段bin。此字段bin与表计数中的bin1bin2相关联,并且也会编入索引。所以,在这里,我想要的是让表counts中的所有行在coordinates.binbin1字段中都有bin2。为什么在此步骤中不使用索引?

除此之外,我想在ORDER BY语句之前的查询中添加LIMIT。但是我的查询速度太慢了。我不知道为什么,因为它必须最多排序4000行......

如何优化查询?

我的表格,来自DESCRIBE声明:

表计数

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| bin1  | varchar(20) | NO   | MUL | NULL    |                |
| bin2  | varchar(20) | NO   | MUL | NULL    |                |
| count | float(6,2)  | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

表格坐标

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| bin   | varchar(20) | NO   | PRI | NULL    |       |
| chr   | varchar(20) | NO   | MUL | NULL    |       |
| start | int(11)     | NO   |     | NULL    |       |
| end   | int(11)     | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

0 个答案:

没有答案