编辑:当我删除我正在搜索的列上的索引时,响应时间从大约2.5秒到大约2.6秒。这种差异应该不是很多吗?
我正在编写一个使用jquery autosuggest插件的小应用程序。用户开始键入其家乡的名称,我的代码使用AJAX查询包含城市名称(maxmind city database)的270万行的表格。我在搜索的db列(city_name)上设置索引。
当我运行以下查询时(使用CodeIgniter Active Record),CI的基准类报告 2.1922秒(仅针对该查询,因此不包括html页面加载时间)。
SELECT * FROM cities WHERE city_name 喜欢“%bang%”
当我在phpmyadmin中运行相同的查询时,我得到:查询 0.0068秒
当我跑步时
SELECT * FROM cities WHERE city_name 像“%bangkok%”
CI的基准类报告 2.1951秒。当我在phpmyadmin中运行相同的查询时,我得到:查询耗时2.1811秒。
因此,虽然CI的响应时间对于两个查询几乎相同,但在phpmyadmin中运行的响应时间却大不相同。
问题
显然查询270万行会比较慢,但有没有办法可以获得这样一个自动建议功能的合理响应时间? 2.5秒太慢了。 AFAIK没有快速的方法在包含所有270万行的PHP数组中使用“LIKE”语法进行搜索。 memcache会是一个选择吗?
为什么使用CI Active Record时响应时间差异可以忽略不计,但在phpmyadmin中差异很大?
答案 0 :(得分:2)
你最想要的是像数据库或卡丁车这样的特里。这是一个字典数据结构,您可以加载内存中的所有城市。但您也可以从中创建数据库。然后,您希望将trie的复杂性降低到嵌套集。 kart-trie与radix-trie或patricia-trie的不同之处在于它每个节点最多有2个叶子,因此很容易减少到嵌套集。
答案 1 :(得分:2)
通过索引您要搜索的列,您可以获得显着的好处(至少快100倍)。
看看7.3.1. How MySQL Uses Indexes。
修改强>
phpmyadmin和你的基准测试工具是否在同一台机器上运行? Phpmyadmin应该在与数据库相同的机器上运行,但基准工具不能。在时间测量中,基准测试工具可能会考虑网络时间过载(而不是html渲染页面)。
答案 2 :(得分:1)
默认情况下启用查询缓存;您需要将SQL_NO_CACHE添加到查询中以绕过:
SELECT SQL_NO_CACHE * FROM TABLE...
更多信息: MySQL - force not to use cache for testing speed of query
答案 3 :(得分:1)
您可以在适用条件的字段上创建索引。但索引不适用于'%abc%'的通配符搜索,因为在这种情况下,mysql需要遍历每条记录以匹配最佳结果的条件,您只能使用'%abc'或'abc%'来使用索引
您还可以描述/解释查询以分析查询,并查看查询是否正在使用索引。
例如:
解释SELECT * FROM cities WHERE city_name LIKE“%bangkok%”