Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询分析34k条记录中的16k条记录_Mysql_Query Optimization - Fatal编程技术网

Mysql 查询分析34k条记录中的16k条记录

Mysql 查询分析34k条记录中的16k条记录,mysql,query-optimization,Mysql,Query Optimization,表用户有大约34k条记录 我提出这个问题- 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(us

表用户有大约34k条记录

我提出这个问题-

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 |
+----+-------------+---------+-------+---------------+-------+---------+------+-------+-------------+
表上的索引-

用户(用户类型、用户状态)

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

这是您的查询

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
子句是完整的通配符搜索。常规索引可用于
,但仅当模式以非通配符开头时。所有模式都以
%
开头,因此常规索引无法工作

你的比较是不平等的比较。再一次,索引很少用于这些。索引最好应用于相等谓词


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

可能的重复:请注意,没有ORDER BY的限制几乎没有意义,而且大多数MySQL实现都不区分大小写。您不能在“%”上使用索引,但可以在“…%”上使用索引!这意味着没有任何改进其性能的解决方案。如果您解释此查询试图实现的目标,我们将有其他建议……但您可以尝试。(但如果返回的数据集超过50%,则可能不会)@草莓。实际上,只返回了20条记录。我不太确定
限制
将如何与全文搜索中的其他因素相互作用。