Siq*_*Lin 5 mysql innodb count
现在,我正在讨论是否使用COUNT(id)或"计数"列.我听说InnoDB COUNT在没有WHERE子句的情况下非常慢,因为它需要锁定表并进行完整的索引扫描.使用WHERE子句时这是相同的行为吗?
例如,如果我有一个包含100万条记录的表.如果COUNT没有WHERE条款,则需要使用索引查找100万条记录.如果添加一个WHERE子句会减少符合条件的行数(从100万到500,000),查询是否会明显加快?
考虑一下SO上的"徽章"页面,会在badges表格中添加一个列,count并且只要用户获得该特定徽章的速度比执行一个更快,就会递增它SELECT COUNT(id) FROM user_badges WHERE user_id = 111吗?
使用MyIASM不是一种选择,因为我需要InnoDB的功能来维护数据完整性.
SELECT COUNT(*)FROM tablename似乎进行全表扫描.
SELECT COUNT(*)FROM tablename如果可用的索引是NOT NULL,UNIQUE和fixed-length,则USE INDEX(colname)似乎非常快.如果有的话,非UNIQUE索引没有多大帮助.可变长度索引(VARCHAR)似乎较慢,但这可能只是因为索引在物理上更大.可以快速计算整数UNIQUE NOT NULL索引.这是有道理的.
MySQL真的应该自动执行这个优化.
我不会说避免,但这取决于你想要做什么:
如果您只需要提供估计值,您可以执行 SELECT MAX(id) FROM table。这要便宜得多,因为它只需要读取索引中的最大值。
如果我们考虑您给出的徽章示例,InnoDB 只需要计算用户拥有的徽章数量(假设 user_id 上有索引)。我想说,在大多数情况下,不会超过 10-20 个,而且根本没有太大危害。
这确实取决于具体情况。我可能会将某人在主用户表上拥有的徽章数量保留为一列(count_badges_awarded),因为每次显示头像时,该数字也会显示。它使我不必执行 2 个查询。