编辑:当我删除正在搜索的列上的索引时,响应时间从大约 2.5 秒变为大约 2.6 秒。差异不应该大得多吗?
我正在编写一个使用 jquery autosuggest 插件的小型应用程序。用户开始输入他家乡的名称,我的代码使用 AJAX 查询包含城市名称(maxmind 城市数据库)的 270 万行表。我在正在搜索的数据库列 (city_name) 上设置了一个索引。
当我运行以下查询(使用 CodeIgniter Active Record)时,CI 的基准类报告 2.1922 秒(仅针对该查询,因此这不包括 html 页面加载时间)。
SELECT * FROM cities WHERE city_name LIKE "%bang%"
当我在 phpmyadmin 中运行相同的查询时,我得到:查询耗时 0.0068 秒
当我运行时
SELECT * FROM cities WHERE city_name LIKE "%bangkok%"
CI 的基准类报告 2.1951 秒。当我在 phpmyadmin 中运行相同的查询时,我得到:Query take 2.1811 sec.
因此,尽管 CI 对这两个查询的响应时间几乎相同,但在 phpmyadmin 中运行的响应时间却大不相同。
问题
显然,查询 270 万行会相对较慢,但对于这种自动建议功能,我有什么方法可以获得不错的响应时间? 2.5秒太慢了。据我所知,没有快速的方法可以在包含所有 270 万行的 PHP 数组中使用“LIKE”语法进行搜索。内存缓存会是一个选择吗?
为什么在使用 CI Active Record 时响应时间差异可以忽略不计,但在 phpmyadmin 中差异如此之大?
最佳答案
通过索引您正在搜索的列,您可以获得显着的好处(至少快 100 倍)。
看看7.3.1. How MySQL Uses Indexes .
编辑
phpmyadmin 和您的基准测试工具是否在同一台机器上运行? Phpmyadmin 应该与数据库在同一台机器上运行,但基准测试工具不能。在时间测量中,基准工具可能会考虑网络时间过载(而不是 html 渲染页面)。
关于php - 查询 200 万+行 : response times and optimization? (PHP Codeigniter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272364/