我正在尝试加速一个简单的SELECT查询,在一个MariaDB MySQL数据库中,有大约200万个条目的表。在我为我需要的列创建索引之前,它花了1.5秒,通过PhpMyAdmin运行它显示了速度的显著提升(现在花了大约0.09秒)。
问题是,当我通过PHP服务器(mysqli)运行它时,执行时间根本没有变化。我通过在查询前后运行microtime()
来记录我的执行时间,运行它需要大约1.5s,无论是否有索引(尝试删除/重新添加它以查看差异)。
查询示例:
SELECT `pair`, `price`, `time` FROM `live_prices` FORCE INDEX
(pairPriceTime) WHERE `time` = '2022-08-07 03:01:59';
创建的索引:
ALTER TABLE `live_prices` ADD INDEX pairPriceTime (pair, price, time);
对此有什么想法吗?PHP PDO会忽略索引吗?我需要重新启动服务器才能“确认”有新的索引吗?(这是一个问题,因为我使用的是共享主机服务...)
3条答案
按热度按时间qni6mghb1#
如果这真的是查询,那么它需要一个
INDEX
*,以 *WHERE
中测试的值开头:或者,制作一个“覆盖指数”:
但是,我怀疑您的大多数访问都涉及
pair
。如果是这样,那么其他查询可能需要特别是当你在一个时间范围内的时候。
要进一步讨论各种选项,请提供
EXPLAIN SELECT ...
PDO、mysqli、phpmyadmin --它们的工作方式都是一样的(一个可能的例外是处理phpmyadmin上的隐式
LIMIT
)。尽量避免使用
FORCE INDEX
--对今天的查询和数据集有用的东西可能会对明天的查询和数据集有害。当您在计时中看到令人费解的异常时,请运行两次查询。高速缓存可能是原因。
rn0zuynd2#
mysql文档中说
FORCE INDEX提示的作用类似于USE INDEX(index_list),只是表扫描的开销被认为非常大。换句话说,只有在无法使用某个命名索引来查找表中的行时,才使用表扫描。
此处的MariaDB文档Force Index是这样说的
FORCE INDEX的工作原理是只考虑给定的索引(与USE_INDEX类似),此外,它还告诉优化程序将表扫描视为开销很大的操作。但是,如果没有任何'强制'索引可以使用,则无论如何都将使用表扫描。
索引的使用不是强制性的。因为您只指定了一个条件-时间,它可以选择使用其他索引来获取。我建议您在where子句中使用其他条件来选择,或者添加一个排序依据
ou6hu8tu3#
最后我创建了另一个索引(只针对
time
列),它成功了,现在运行速度为~0.002s。设置LIMIT子句没有任何效果,因为我总是得到423行(对应423个硬币对)。总之,我可能需要一个更具体的索引,尽管奇怪的是,第一个索引在PMA上工作得很好,但在PHP上却不行,但第二个索引现在适用于这两种方法。
谢谢你们所有人的友好回复:)