我有以下查询:
SELECT COUNT(*) AS `numrows`
FROM (`phppos_items`)
WHERE `deleted` = 0
解释:
mysql> explain SELECT COUNT(*) AS `numrows`
-> FROM (`phppos_items`)
-> WHERE `deleted` = 0;
+----+-------------+--------------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | phppos_items | ref | deleted | deleted | 4 | const | 1 | Using index |
+----+-------------+--------------+------+---------------+---------+---------+-------+------+-------------+
随着表中行的增长,此查询是否总是被索引并快速?
“随着表中行的增长,这个查询是否总是被索引并且快速?”
绝对不一定。如果有许多记录和/或 deleted 的值以某种方式倾斜(即它(几乎)总是一个特定值,或拆分 50-50),那么优化器可能会决定忽略给定的索引。谷歌搜索“为什么 mysql 不使用索引”给出 3.5M 的结果
[编辑]
你说:
“感谢您的回答。我可以使用其他类型的查询来计算带有 WHERE 子句的行数吗?”
不 - 这就是 COUNT() 的用途。见这里。基本上,您无法解决您概述的问题 - 索引通常很有帮助,但没有“灵丹妙药”可以很好地应对所有数据量和配置文件。
要了解这个问题有多么困难,请查看这里- 这是关于 RDBMS 如何决定最佳查询计划的基础知识的> 600 页。这绝不是一个小问题!