我有以下查询:
SELECT k from
tbl t
WHERE
(LOWER( col1 ) LIKE '9000000003%')
AND
(col2=12334534 )
order by t.col1 ASC
LIMIT 0,50
tbl
有大约187000行
这个查询非常慢(我不能等到它完成),当我在WHERE
和ORDER BY
一起时。但是,如果我在可行时间内删除ORDER BY
或LIKE
条件查询
当我将它分成两个查询时,此查询也会执行得非常快:
SELECT k from (
select * from
tbl t
WHERE
(LOWER( col1 ) LIKE '9000000003%')
AND
(col2=12334534 )
) x
order by x.col1 ASC
LIMIT 0,50
主要问题是生成了查询,所以我无法重写它。
我该如何优化它?
解释计划
id select_type table type possible_keys key key_len ref rows extra
'1', 'SIMPLE', 'tbl', 'index', NULL, 'col1_idx', '768', NULL, '50', 'Using where'
DDL
field type null key default extra
k bigint(20) NO PRI
col1 varchar(255) YES MUL
col2 bigint(20) NO
PS我可以完全访问mysql服务器(我使用5.6)
答案 0 :(得分:1)
这是您的查询:
SELECT k
from tbl t
WHERE LOWER( col1 ) LIKE '9000000003%' AND
col2 = 12334534
order by t.col1 ASC
LIMIT 0, 50;
lower()
完全没必要,因为模式只有数字(加上默认排序规则对like
不区分大小写)。因此,您可以像这样重写查询:
SELECT k
from tbl t
WHERE col1 LIKE '9000000003%' AND
col2 = 12334534
order by t.col1 ASC
LIMIT 0, 50;
然后,您可以使用索引来加速查询。最好的指标是:
create index tbl_col2_col1_k on tbl(col2, col1, k);
这应该使查询非常快。