查询解析34k记录中的16k条记录

时间:2014-01-20 13:28:02

标签: mysql query-optimization

表用户有大约34,000条记录。

我正在解雇此查询 -

SELECT user_pid, user_fname, user_lname, user_uname, user_mobno, user_email, user_date,
  user_userid, user_type, user_status
FROM User
WHERE ((lower(user_fname) like'%all%'
   OR lower(user_fname) like'%that%') 
   OR (lower(user_lname) like'%all%'
   OR lower(user_fname) like'%that%'))
   AND user_status!=3
   AND user_type != 1
LIMIT 20;

解释结果是 -

+----+-------------+---------+-------+---------------+-------+---------+------+-------+-------------+
| id | select_type | table   | type  | possible_keys | key   | key_len | ref  | rows  | Extra       |
+----+-------------+---------+-------+---------------+-------+---------+------+-------+-------------+
|  1 | SIMPLE      | User | range | users         | users | 4       | NULL | 16967 | Using where |
+----+-------------+---------+-------+---------------+-------+---------+------+-------+-------------+

表格上的索引 -

用户(user_type,user_status)

我应该在哪里添加索引以快速进行此查询?

1 个答案:

答案 0 :(得分:2)

这是您的查询

SELECT user_pid, user_fname, user_lname, user_uname, user_mobno, 
       user_email, user_date, user_userid, user_type, user_status
FROM User
WHERE ((lower(user_fname) like'%all%' or lower(user_fname) like '%that%') or
       (lower(user_lname) like'%all%' or lower(user_fname) like '%that%' )
      ) and user_status!=3 and user_type != 1
limit 20;

首先,根据匹配结果的大小,34k中的16k,索引可能无法帮助你。

让我进一步阐述。您的like子句是完整的通配符搜索。常规索引可用于like,但仅限于模式以非通配符开头时。您的所有模式都以%开头,因此常规索引无效。

您的比较是非平等比较。再一次,很少会使用索引。索引最适用于等式谓词。

我可以预见的唯一索引方案是名称字段user_fnameuser_lname上的全文索引。我不确定这是否有助于提高性能,但你可以试试。