0

我有一个超过 12 列的表。这是用于检索最新 7 条记录的 mysql 查询

SELECT * FROM data WHERE user_id IN(12,10,7,1) HAVING continent IN('Europe','America','Australia') AND NOT MATCH(weather) AGAINST('+"[blues]"' IN BOOLEAN MODE) || continent = 'Asia' AND MATCH(weather) AGAINST('+"[purples]"' IN BOOLEAN MODE) ORDER BY tb_id DESC LIMIT 7

总行数超过5 million并且user_id是一个索引列,tb_id其中PRIMARY KEY. 当我使用EXPLAIN前面的SELECT. MySQL 表示它将从总共 500 万条记录中读取超过 40 万条记录。

那么我应该索引大陆列还是在这种情况下无济于事?

这是解释结果

id = 1; select_type = SIMPLE; table = data; possible_keys = user_id; key = user_id; ref = NULL; rows = 582; Extra = Using where, Using filesort

4

1 回答 1

1

首先,您的查询可能是错误的。当你在 where 或 having 子句或任何地方使用 mix ORwith时,你应该使用括号。AND

其次,在您的情况下使用 HAVING 没有意义,优化器很可能会将其转换为 WHERE 子句。

两者之间的区别在于,WHERE在确定要选择的行时应用。HAVING应用于结果集。因此,如果优化器做得不好,您将首先获得(几乎)所有行,然后过滤这些行。当你把它全部放在WHERE子句中时,你只会得到相关的行。HAVING(几乎)仅在您使用GROUP BY.

所以,你最好这样写你的查询:

SELECT * FROM data 
WHERE user_id IN(12,10,7,1) AND
(
(
continent IN('Europe','America','Australia') 
AND NOT MATCH(weather) AGAINST('+"[blues]"' IN BOOLEAN MODE) 
)
OR 
(
continent = 'Asia' 
AND MATCH(weather) AGAINST('+"[purples]"' IN BOOLEAN MODE) 
)
)
ORDER BY tb_id DESC LIMIT 7

要回答有关索引的问题,请发布说明的结果和表的创建语句data

于 2013-02-06T10:12:19.163 回答