我在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秒
SELECT COUNT(*) FROM table WHERE fk = 1
SELECT COUNT(*) FROM table WHERE fk = 1 LIMIT 5000
SELECT primary FROM table WHERE fk = 1
我的网络和治疗时间会更长一些,但可能会超过15.4秒!
你有更好的主意吗?
谢谢
编辑:[添加了OP的相关评论]
我尝试从WHERE fk = 1表中选择SELECT SQL_NO_CACHE COUNT(fk),但是花了25秒
使用Mysql Tuner为Innodb调整了Mysql。
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
DB资料:
'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万新行。它仍然可以正常工作。
最后,最快的方法是使用C#查询前X行并计算行数。
我的应用程序正在批量处理数据。两批之间的时间长短取决于需要处理的行数
SELECT pk FROM table WHERE fk = 1 LIMIT X
我在0.9秒内得到了结果。
谢谢大家的想法!