使用id
(主键)和hash
(索引)的简单mysql表。其他一些列(varchar / int)但不需要对它们进行查询。
我的总表大小约为350MB,行数为2.5M。
SELECT COUNT(*) FROM table LIMIT 1;
大约需要0.5 - 1s。我的innodb缓冲区设置为1GB。我也尝试了变化(没有改进),如:
SELECT COUNT(id) FROM table LIMIT 1;
SELECT COUNT(*) FROM table WHERE id > 0 LIMIT 1;
单个
SELECT * FROM table WHERE id = 'x' LIMIT 1;
将在1 ms内返回(localhost mysql)。任何有关改善慢速计数(0.5 - 1s)的提示都将不胜感激。
答案 0 :(得分:1)
前段时间我发现,MyISAM表可以让这些操作更快。但并非所有表格和架构都可以是MyISAM。检查您的架构,也许您可以将此表切换到MyISAM。
同时使用COUNT(1)
代替COUNT(*)
另一种技巧适合你。在分开的位置创建触发器并保存计数。创建counter_table
并按下触发器:
DELIMITER //
CREATE TRIGGER update_counter AFTER INSERT ON table_name
FOR EACH ROW
BEGIN
UPDATE counter_table
SET counter = counter + 1
END;
答案 1 :(得分:1)
你可以找到一个简单的解释here。简而言之,innodb必须进行全表扫描才能计算所有行(没有where子句,这将使用索引)。 另请参阅this answer。
顺便说一句,我在查询中使用LIMIT 1
时看不到任何意义。由于没有group by
子句,它将始终返回一条记录。