当前位置: 首页 > 面试题库 >

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

松元明
2023-03-14
问题内容

我在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的相关评论]

我尝试从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秒内得到了结果。

谢谢大家的想法!



 类似资料:
  • 问题内容: 我最近一直在尝试使用Redis和MongoDB,似乎经常会在MongoDB或Redis中存储 ID 数组。因为我要询问MySQL IN 运算符,所以我会坚持使用Redis 。 我想知道在IN运算符中列出大量(300-3000) id的 性能如何,看起来像这样: 想象一下简单的 产品* 和 类别 表,您通常可以将它们结合在一起以从某个 类别中 获得 产品 。在上面的示例中,您可以看到在R

  • 问题内容: 我需要在MySQL表中存储大量(数千万)的512位SHA-2哈希。为了节省空间,我想以二进制形式存储它们,而不是以十六进制数字的字符串存储。我使用的是ORM(DBix :: Class ),因此将从代码中抽象出存储的特定详细信息,从而可以将它们扩充到我选择的任何对象或结构中。 MySQL的类型是64位。因此,我可以从理论上将散列划分为八列。不过,这似乎很荒谬。我的其他想法只是使用单个列

  • 问题内容: 有一天,我怀疑我将不得不学习hadoop并将所有这些数据传输到非结构化数据库中,但是我感到惊讶的是,在如此短的时间内,性能如此显着下降。 我有一个只有不到600万行的mysql表。我正在对该表进行非常简单的查询,并相信我已经安装了所有正确的索引。 查询是 解释返回 因此,据我所知,我使用的索引正确,但是此查询需要11秒钟才能运行。 数据库是MyISAM,而phpMyAdmin表示该表是

  • 我搜索了数据库和食谱,但似乎找不到正确的答案。我有一个非常简单的python代码,它总结了一个范围内的自我权力。我需要这个非常非常大的数字的最后十位,我已经尝试了get上下文(). prec,但是我仍然达到了极限。 代码如下: 我怎么能看到这些美丽的数字?它在我的四核上打印速度相对较快。这只是为了给ProjectEuler带来乐趣,问题#48,请不要破坏者。我不想要解决方案,也不想让工作为我完成,

  • 问题内容: 我需要一种方法来计算Python中长整数的第n个根。 我试过了,但是不起作用: OverflowError:long int太大,无法转换为float 有任何想法吗? 长整数是指真正的长整数,例如: 11968003966030964356885611480383408833172346450467339251 1960931441410456834630852911156774884

  • 问题内容: 抱歉,很长的帖子! 我有一个包含约30个表的数据库(InnoDB引擎)。这些表中只有两个表,即“ transaction”和“ shift”非常大(第一个表有150万行,而shift有23000行)。现在一切正常,我对当前的数据库大小没有任何问题。 但是,我们将有一个类似的数据库(相同的数据类型,设计等),但数据库更大,例如,“事务”表将具有约 10亿条记录 (每天约有 230 万笔交