在where子句已经被索引的情况下,如何加快mysql查询的速度?

6bc51xsx  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(340)

我有下面的查询,需要300毫秒和450毫秒之间的处理。
该表约有30万行,大小为46MB。
我创建了以下索引:
索引1-国家和国家ISO
索引2-城市和城市BBR
索引3-城市和城市BBR和国家和国家iso

SELECT latitude, longitude, timezone
FROM geolocate WHERE
(LCASE(country) = 'cambodia' OR LCASE(countryiso) = 'cambodia')
AND
(
(LCASE(city) = 'kaôh préab' OR LCASE(cityabbr) = 'kaôh préab')
);

我觉得300毫秒的时间太长了,但我不知道如何让这个速度再加快。
我试图创建单独的列索引,但没有效果。
如果有人能提供任何帮助,我将不胜感激。

jtw3ybtb

jtw3ybtb1#

(o.jones解释说要摆脱 LCASE ; 我会说 OR 在给定查询的上下文中。)
计划a:让你的应用程序识别名字是完整的还是缩写的。如果您需要标准的两个字母的国家/地区代码,例如 KH ,然后检查输入的长度并构建适当的查询以避免 OR . country_code 应该是 CHAR(2) 字符集ascii。 方案b:转弯OR进入UNION. 对于原始查询,需要4个SELECTsUNION. 在a计划之后,你只能得到2个。 方案c:有一个包含city--拼写、缩写、中文等。此表将Map到主表中使用的规范拼写。这样,你就可以避免OR为了city. d计划:多吃一点TEXT列有城市,城市,乡村,乡村。可能还有不同的拼写。将此列编入索引FULLTEXT` . 警告:简短的“单词”有问题;您可能应该将mintokensize设置为2,以便捕获国家代码。

qpgpyjmq

qpgpyjmq2#

假设表中的列使用 utf8 字符集及其默认排序规则 utf8_general_ci :
你不需要 LCASE() 函数调用,因为mysql已经使用了不区分大小写的比较。例如,改变, LCASE(country) = 'cambodia'country = 'cambodia' .
排序规则被烘焙到索引中,因此如果存在索引,这是有效的。
您的index2是不必要的,因为它也包含在index3中。
查询 OR 操作往往很慢。有一些技巧可以加快速度。
我不知道你的索引是否正确。为此,需要显示explain结果和表定义。请阅读这篇关于询问好的sql问题的注解,并注意有关查询性能的部分。
我会提供关于如何修改列定义的建议,但您没有提供表定义。

相关问题