我有下面的查询,需要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毫秒的时间太长了,但我不知道如何让这个速度再加快。
我试图创建单独的列索引,但没有效果。
如果有人能提供任何帮助,我将不胜感激。
2条答案
按热度按时间jtw3ybtb1#
(o.jones解释说要摆脱
LCASE
; 我会说OR
在给定查询的上下文中。)计划a:让你的应用程序识别名字是完整的还是缩写的。如果您需要标准的两个字母的国家/地区代码,例如
KH
,然后检查输入的长度并构建适当的查询以避免OR
.country_code
应该是CHAR(2)
字符集ascii。 方案b:转弯
OR进入
UNION. 对于原始查询,需要4个
SELECTs在
UNION. 在a计划之后,你只能得到2个。 方案c:有一个包含
city--拼写、缩写、中文等。此表将Map到主表中使用的规范拼写。这样,你就可以避免
OR为了
city. d计划:多吃一点
TEXT列有城市,城市,乡村,乡村。可能还有不同的拼写。将此列编入索引
FULLTEXT` . 警告:简短的“单词”有问题;您可能应该将mintokensize设置为2,以便捕获国家代码。qpgpyjmq2#
假设表中的列使用
utf8
字符集及其默认排序规则utf8_general_ci
:你不需要
LCASE()
函数调用,因为mysql已经使用了不区分大小写的比较。例如,改变,LCASE(country) = 'cambodia'
至country = 'cambodia'
.排序规则被烘焙到索引中,因此如果存在索引,这是有效的。
您的index2是不必要的,因为它也包含在index3中。
查询
OR
操作往往很慢。有一些技巧可以加快速度。我不知道你的索引是否正确。为此,需要显示explain结果和表定义。请阅读这篇关于询问好的sql问题的注解,并注意有关查询性能的部分。
我会提供关于如何修改列定义的建议,但您没有提供表定义。