gpt4 book ai didi

mysql - 在 HAVING 子句中对列建立索引 - MySQL

转载 作者:行者123 更新时间:2023-11-29 14:03:30 25 4
gpt4 key购买 nike

我得到了一个包含超过 12 列的表格。这是用于检索最新 7 条记录的 mysql 查询

SELECT * FROM 数据 WHERE user_id IN(12,10,7,1) HAVING 大陆 IN('欧洲','美洲','澳大利亚') AND NOT MATCH(天气) AGAINST('+"[布鲁斯]"' 在 bool 模式) ||大陆 = '亚洲' AND MATCH(weather) AGAINST('+"[purples]"' IN BOOLEAN MODE) ORDER BY tb_id DESC LIMIT 7

总行数超过500万,并且user_id是索引列,tb_idPRIMARY KEY 。当我在SELECT前面使用EXPLAIN时。 MySQL 表示将从总共 500 万条记录中读取超过 40 万条记录。

那么我应该为大陆列建立索引吗?否则在这种情况下它不会有帮助?

这是解释结果

id = 1;选择类型=简单;表=数据;可能的 key =用户id; key =用户ID;引用=空;行= 582; Extra = 使用where,使用文件排序

最佳答案

首先,您的查询可能是错误的。当您在 where 或having 子句或任何地方将 ORAND 混合使用时,应使用括号。

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

两者之间的区别在于,在确定要选择哪些行时应用WHEREHAVING 应用于结果集。因此,如果优化器不能很好地完成工作,您将首先获取(几乎)所有行,然后过滤这些行。当您将其全部放入 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 的解释结果和创建语句。

关于mysql - 在 HAVING 子句中对列建立索引 - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com