mysql - 改进我的 MYSQL 查询

标签 mysql

# Query_time: 0.007476  Lock_time: 0.000012 Rows_sent: 4  Rows_examined: 13463 
SELECT id,name FROM items 
WHERE items_approved = 1 AND item_name LIKE '%apple%' 
ORDER BY RAND() LIMIT 4;

我刚刚注意到我的 mysql-slow.log 中有很多慢速查询 所以我开始一一优化它们......

让我们从这个简单的查询开始:

SELECT id,name FROM items 
WHERE items_approved = 1 AND item_name LIKE '%red%' 
ORDER BY RAND() LIMIT 4;

但是该表包含 15K 个项目,因此我需要一种更好的方法来获取 4 个随机项目。 items 表有两个索引:一个是 name 上的全文索引,一个是 id 上的主索引

在我的电子商务中,目标基本上是在用户访问页面时,为每个类别(大约 15 个类别)显示 4 个名称中包含“红色”一词的随机项目。

有什么更好的方法吗?

更新

my.cnf是这样设置的

 log_slow_queries   = /var/log/mysql/mysql-slow.log
 long_query_time = 2
 log-queries-not-using-indexes

最佳答案

SELECT id,name FROM items 
WHERE items_approved = 1 
  AND item_name LIKE '%red%' -- '% %' doesnt use index, change to FULL TEXT SEARCH
ORDER BY RAND() 
LIMIT 4;

检查MySQL索引TIPS

如果您有全文索引,应尝试以下操作:

SELECT id,name FROM items 
WHERE items_approved = 1 
  AND MATCH(item_name) 
  AGAINST('red' IN BOOLEAN MODE )
ORDER BY RAND() 
LIMIT 4;

关于mysql - 改进我的 MYSQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40898405/

相关文章:

MySQL连接4张表

php - 使用 mysql_affected_rows 是否安全

mysql - 这个更新声明是如何工作的?

mysql - sql查询有助于对同时包含字符串和数字的字段进行排序

mysql - DELPHI 用 ADO 查询的结果填充一个列表框

MySQL 查询 - 包括没有记录的日期

python - 如何选择 Python 列表框数据并将其填充到特定的实体框 - 预输入

mysql - INET_ATON - mysql 查询到 ms-sql 查询

mysql - 仅检查数据库中数字字符的 SQL 查询

mysql - query.reduce 性能缓慢