在大型数据库中使用 JOIN 进行 MySQL 查询

标签 mysql database

我有一个包含数亿行的 MySQL 表。请参阅下面的创建语句:

 CREATE TABLE `transaction_history` (
  `transaction_history_id` int(11) NOT NULL AUTO_INCREMENT,
  `type_id` int(11) NOT NULL,
  `sub_type_id` int(11) DEFAULT NULL,
  `transaction_id` int(11) DEFAULT NULL,
  `settlement_date_time` datetime DEFAULT NULL,
  PRIMARY KEY (`transaction_history_id`),
  UNIQUE KEY `transaction_history_id_UNIQUE` (`transaction_history_id`),
  KEY `type_id_idx` (`type_id`),
  KEY `sub_type_id_idx` (`sub_type_id_id`),
  KEY `transaction_id_idx` (`ufmid`),
  KEY `settlement_date` (`settlement_date_time`),
  KEY `type_sub_type` (`type_id`,`sub_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=36832823 DEFAULT CHARSET=latin1;

表中信息: 每个transaction_id 有多个settlement_date_times。 type_id 和 sub_type_id 一起是唯一的

我需要创建的查询: 对于每个 transaction_id,我需要获取最新的结算日期时间,然后计算(type_id 和 sub_type)的数量。

所以结果看起来像这样:

(type_id,sub_type_id) -> count 
(3,4) -> 23500
(2,2) -> 569323
(2,3) -> 45028
(3,2) -> 1038943

无论我做什么,我都无法创建运行相当快的查询。我创建的所有内容都会在 20 分钟后超时。有没有办法在几分钟或几秒钟内运行此查询?

我试过的查询之一:

select count(a1.transaction_id), a1.type_id, a1.sub_type_id
from  transaction_history a1, transaction_history a2 
where a1.transaction_id= a2.transaction_id
and  not exists (Select a1.settlement_date_time < a2.settlement_date_time) 
group by a1.type_id, a1.sub_type_id

谢谢

最佳答案

试试这个。

select count(a1.transaction_id), a1.type_id, a1.sub_type_id  
from  transaction_history a1 join transaction_history a2 using(transaction_id)
where  a1.settlement_date_time > a2.settlement_date_time 
group by a1.type_id, a1.sub_type_id

希望对你有帮助

关于在大型数据库中使用 JOIN 进行 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50234134/

相关文章:

mysql - MySQL 中何时使用单引号、双引号和反引号

php - 如何从已拖放到特定区域的图像中获取值并插入到数据库中?

mysql - SELECT INNER JOIN 只返回一个结果

java - JDBC插入查询不会在数据库中插入记录

sql - 选择常量作为伪列并对伪列进行算术运算

sql - MySQL 中 MyISAM 存储引擎上的检查约束等约束,而不是空约束

php - 是否有可能防止 MySQL 查询出错并导致您的网站瘫痪?

c# - 是否可以使用 SQL 查询搜索 DataGridView 或 DataTable

android - 从 Assets 文件夹升级 Android SQLite 数据库

java - 如何检索这些数据而不在内存中进行转换?