我们有一个 MySQL 表格,
CREATE TABLE `my_data` (
`auto_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_ts` timestamp NOT NULL DEFAULT 0000-00-00 00:00:00 ,
`data_txt` varchar(256) CHARACTER SET utf8 NOT NULL,
`issued_ts` timestamp NULL DEFAULT NULL,
`account_id` int(11) NOT NULL,
PRIMARY KEY (`auto_id`),
KEY `account_issued_idx` (`account_id`,`issued_ts`),
KEY `account_issued_created_idx` (`account_id`,`issued_ts`,`created_ts`),
KEY `account_created_idx` (`account_id`,`created_ts`),
KEY `issued_idx` (`issued_ts`)
) ENGINE=InnoDB;
表格中有大约900M行,其中1个账户_ID占这些行的65%以上。我被要求为创建的和发行的取决于账户_id的账号填写不同日期范围的查询,该账号似乎对自动递增键有1:1的功能依赖性。
典型的查询会是这样的 :
SELECT *
FROM my_data
WHERE account_id = 1 AND
created_ts > TIMESTAMP( 2012-01-01 ) AND
created_ts <= TIMESTAMP( 2012-01-21 )
ORDER BY created_ts DESC LIMIT 100;
查询的一则解释显示:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: my_data
type: range
possible_keys: account_issued_idx, account_issued_created_idx, account_created_idx,
key: account_issued_created_idx
key_len: 8
ref: NULL
rows: 365314721
Extra: Using where
问题在于查询需要的时间太长, 最终被杀死 。 我让它运行过几次, 并且它把数据库主机拖下水, 因为 OS (Linux) 的交换空间用完了 。
我反复研究过这个问题,并试图将查询分解为与气候无关的小问题、强迫指数、使用明确的SELECT条款和限制日期范围窗口,但结果是一样的:业绩不佳(太慢)和对东道主过于征税(总是死亡)。
我的问题是:
能否制定一个查询, 将数据切成日期范围, 并可以接受实时调用? ( & lt; 1s)
为了得到要求我完成的表演,我是否缺少或可能有所帮助的优化?
欢迎任何其他建议、暗示或想法。
谢谢 谢谢