2017-02-14 60 views
0

我使用MySQL,太迟了,直到我意识到查询需要很长时间才能响应需要的列作为索引。
我理解索引工作的方式,但我想知道索引是否可以以COUNT(*)或COUNT(col1)(其中col1被索引)的方式实现,将与执行'WHERE COL = 007 '? 我问这是因为在我的应用程序中,我经常需要进行计数查询。对于更快的操作流程来说,减少响应非常重要。为什么索引不能用于计数(*)?

+0

你的查询是什么?在选择部分有一个“count(*)”不应该阻止使用索引。 – CptMisery

+0

你可能想看看这个:http://stackoverflow.com/questions/286039/get-record-counts-for-all-tables-in-mysql-database –

+0

MySQL不会在count或sum目标上使用索引列。它必须迭代每行以提供结果。 –

回答

0

你说你理解索引的工作方式。但我认为这也是一个聚合函数如何工作的问题。

比方说你犯了一个

SELECT count(col) FROM table; 

它有什么作用?也许它呈现从该表中每一个山坳到计数计数做了

counter++; 

地方。这是一个相当快的操作。

数查询的速度取决于各行的速度有多快,可以呈现给计数功能。 col上的索引不会影响速度,因为无论如何都必须扫描的每一行。索引只是查找某些行比完整表扫描更快的一种手段。

在另一方面,像

​​

快速查询快,因为

SELECT col FROM table WHERE col="rare value"; 

快为好。

我希望这对你有意义。否则,为什么不给我们提供更多的细节,我们尝试和皮条客一个真实的查询?

+0

'COUNT(*)'可以通过* O(1)*从表格元数据中进行评估。该表知道它有多少行。它不需要扫描。或者一个索引。 – EJP

+0

也许你的MySQL版本。我使用5.6.35这不是太旧。我得到'SELECT count(*)FROM countTest; + ---------- + | count(*)| + ---------- + | 500000 | + ---------- + 1行(0,12秒)'这似乎不是O(1) – nCessity

+0

https://dev.mysql.com/doc/internals /en/optimizer-group-by-related-conditions.html说:“如果表处理程序有一个快速行计数可用,然后查询 'SELECT COUNT(*)FROM Table1;' 获得计数没有遍历所有的行,这对MyISAM表是正确的,但对InnoDB表不是这样。“ – nCessity

相关问题