我在Innodb有一张超过1亿行的表.
我必须知道外键是否超过5000行= 1.我不需要确切的数字.
我做了一些测试:
SELECT COUNT(*) FROM table WHERE fk = 1=> 16秒
SELECT COUNT(*) FROM table WHERE fk = 1 LIMIT 5000=> 16秒
SELECT primary FROM table WHERE fk = 1=> 0.6秒
我将拥有更大的网络和治疗时间,但它可能是15.4秒的超载!
你有更好的主意吗?
谢谢
编辑:[添加了OP的相关评论]
我尝试了SELECT SQL_NO_CACHE COUNT(fk)FROM表WHERE fk = 1但是耗时25秒
使用Mysql Tuner调整了Mysod的Innodb.
CREATE TABLE table ( pk bigint(20) NOT NULL AUTO_INCREMENT,
fk tinyint(3) unsigned DEFAULT '0',
PRIMARY KEY (pk), KEY idx_fk (fk) USING BTREE )
ENGINE=InnoDB AUTO_INCREMENT=100380914 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
DB Stuff:
'have_innodb', 'YES' 'ignore_builtin_innodb', …Run Code Online (Sandbox Code Playgroud) 我有一个很大但很窄的InnoDB表,记录大约9米.在桌子上count(*)或count(id)桌子上做的非常慢(6秒以上):
DROP TABLE IF EXISTS `perf2`;
CREATE TABLE `perf2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`channel_id` int(11) DEFAULT NULL,
`timestamp` bigint(20) NOT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ts_uniq` (`channel_id`,`timestamp`),
KEY `IDX_CHANNEL_ID` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
RESET QUERY CACHE;
SELECT COUNT(*) FROM perf2;
Run Code Online (Sandbox Code Playgroud)
虽然声明不经常运行,但优化它会很好.根据http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/,这可以通过强制InnoDB使用索引来实现:
SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY);
Run Code Online (Sandbox Code Playgroud)
解释计划似乎很好:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE perf2 index NULL PRIMARY 4 …Run Code Online (Sandbox Code Playgroud) 有没有办法进一步优化这个或者我是否应该满足于计算11M行需要9秒?
devuser@xcmst > mysql --user=user --password=pass -D marctoxctransformation -e "desc record_updates"
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| record_id | int(11) | YES | MUL | NULL | |
| date_updated | datetime | YES | MUL | NULL | |
+--------------+----------+------+-----+---------+-------+
devuser@xcmst > date; mysql --user=user --password=pass -D marctoxctransformation -e "select count(*) from record_updates where date_updated > '2009-10-11 15:33:22' "; date
Thu Dec 9 11:13:17 EST 2010
+----------+
| count(*) …Run Code Online (Sandbox Code Playgroud) 现在,我正在讨论是否使用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的功能来维护数据完整性.