查询200万行:响应时间和优化? (PHP Codeigniter)

时间:2011-03-11 11:33:14

标签: php mysql codeigniter

编辑:当我删除我正在搜索的列上的索引时,响应时间从大约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中差异很大?

4 个答案:

答案 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%”