使用like和order by查询超级慢

时间:2014-06-30 23:15:01

标签: mysql sql query-optimization

我有以下查询:

SELECT  k from 
tbl t
WHERE 
(LOWER( col1 ) LIKE '9000000003%')
AND 
(col2=12334534 )
order by  t.col1  ASC
LIMIT 0,50

tbl有大约187000行

这个查询非常慢(我不能等到它完成),当我在WHEREORDER BY一起时。但是,如果我在可行时间内删除ORDER BYLIKE条件查询

当我将它分成两个查询时,此查询也会执行得非常快:

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)

1 个答案:

答案 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);

这应该使查询非常快。