【发布时间】:2012-06-14 03:14:41
【问题描述】:
我在 Innodb 中有一个超过 1 亿行的表。
我必须知道外键 = 1 的行是否超过 5000 行。 我不需要确切的数字。
我做了一些测试:
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 的相关 cmets]
我试过 SELECT SQL_NO_CACHE COUNT(fk) FROM table WHERE fk = 1 但花了 25 秒
Mysql 已使用 Mysql Tuner 为 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
数据库资料:
'have_innodb', 'YES' 'ignore_builtin_innodb', 'OFF' 'innodb_adaptive_hash_index', 'ON'
'innodb_additional_mem_pool_size', '20971520' 'innodb_autoextend_increment', '8'
'innodb_autoinc_lock_mode', '1' 'innodb_buffer_pool_size', '25769803776'
'innodb_checksums', 'ON' 'innodb_commit_concurrency', '0',
'innodb_concurrency_tickets', '500' 'innodb_data_file_path',
'ibdata1:10M:autoextend' 'innodb_data_home_dir', '', 'innodb_doublewrite', 'ON'
'innodb_fast_shutdown', '1' 'innodb_file_io_threads', '4'
'innodb_file_per_table', 'OFF', 'innodb_flush_log_at_trx_commit', '1'
'innodb_flush_method', '' 'innodb_force_recovery', '0' 'innodb_lock_wait_timeout', '50'
'innodb_locks_unsafe_for_binlog', 'OFF' 'innodb_log_buffer_size', '8388608'
'innodb_log_file_size', '26214400' 'innodb_log_files_in_group', '2'
'innodb_log_group_home_dir', './' 'innodb_max_dirty_pages_pct', '90'
'innodb_max_purge_lag', '0' 'innodb_mirrored_log_groups', '1' 'innodb_open_files',
'300' 'innodb_rollback_on_timeout', 'OFF' 'innodb_stats_on_metadata', 'ON'
'innodb_support_xa', 'ON' 'innodb_sync_spin_loops', '20' 'innodb_table_locks', 'ON'
'innodb_thread_concurrency', '8' 'innodb_thread_sleep_delay', '10000'
'innodb_use_legacy_cardinality_algorithm', 'ON'
15 年更新: 到目前为止,我使用了相同的方法,每天有 6 亿行和 64 万行新行。它仍然可以正常工作。
【问题讨论】:
-
如果您在
COUNT()中选择一列,计数会更快,例如:SELECT COUNT(fk) FROM table WHERE fk = 1 -
@ClydeFrog:真的吗?根据the manual,如果
SELECT从一个表中检索,没有检索到其他列,并且没有WHERE子句,则COUNT(*)被优化为非常快速地返回。实际上,您链接到的博客表明COUNT(*)比COUNT(column)快。 -
SELECT COUNT(*) FROM table WHERE fk = 1需要 16 秒?你有fk的索引吗? -
您是否进行过任何 InnoDB 配置优化,或者它是开箱即用的?
-
请发布
SHOW CREATE TABLE table;和SHOW VARIABLES LIKE '%innodb%';的输出,以便我们直接看到必要的信息。
标签: mysql sql count query-optimization database-performance