我们有一个类似于这样的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行,其中一个account_id占这些行的65%以上.我被要求在日期范围内为create_ts和issued_ts编写查询,这些查询依赖于account_id,而account_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;
对查询的EXPLAIN显示:
*************************** 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
问题是查询花了太长时间并最终被杀死.我让它运行了几次,它带来了数据库主机,因为操作系统(Linux)耗尽了交换空间.
我反复研究过这个问题,并尝试将查询分解为不相关的子查询,强制索引,使用显式的SELECT子句,并限制日期范围的窗口,但结果是相同的:性能不佳(也是对主人过于沉重(总是死亡).
我的问题是:
>是否可以制定查询以将数据分割为日期范围并对可实现的呼叫执行可接受的操作? (< 1s)
>为了获得我被要求获得的性能,是否存在我缺少或可能有所帮助的优化?
欢迎任何其他建议,提示或想法.
谢谢
解决方法:
似乎mysql对此查询使用了错误的索引,尝试强制另一个:
SELECT *
FROM my_data FORCE INDEX (`account_created_idx`)
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;
标签:mysql,bigdata 来源: https://codeday.me/bug/20190620/1249618.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。