相关疑难解决方法(0)

Mysql在非常大的表上计算性能

我在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)

mysql sql count query-optimization database-performance

36
推荐指数
4
解决办法
5万
查看次数

如何使用索引优化InnoDB上的COUNT(*)性能

我有一个很大但很窄的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)

mysql innodb

26
推荐指数
3
解决办法
4万
查看次数

优化mysql计数查询

有没有办法进一步优化这个或者我是否应该满足于计算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)

mysql sql query-optimization

13
推荐指数
4
解决办法
8708
查看次数

我应该在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的功能来维护数据完整性.

mysql innodb count

5
推荐指数
2
解决办法
3526
查看次数