我有一张超过2.5亿条记录的表。我们的报告服务器使用类似的查询定期查询该表。MySQL查询永久运行
SELECT
COUNT(*),
DATE(updated_at) AS date,
COUNT(DISTINCT INT_FIELD)
FROM
TABLE_WITH_250_Million
WHERE
Field1 = 'value in CHAR'
AND field2 = 'VALUE in CHAR'
AND updated_at > '2012-04-27'
AND updated_at < '2012-04-28 00:00:00'
GROUP BY
Field2,
DATE(updated_at)
ORDER BY
date DESC
我试图创建表,包括字段1,字段2,字段3 DESC以相同的顺序,但它不是给我正确的结果B树索引。
任何人都可以帮助我如何优化它。我的问题是我无法更改查询,因为我没有代码在这个报表服务器正在执行查询。
任何帮助将非常感激。
感谢
这里是我的表:
CREATE TABLE backup_jobs (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
backup_profile_id int(11) DEFAULT NULL,
state varchar(32) DEFAULT NULL,
limit int(11) DEFAULT NULL,
file_count int(11) DEFAULT NULL,
byte_count bigint(20) DEFAULT NULL,
created_at datetime DEFAULT NULL,
updated_at datetime DEFAULT NULL,
status_type varchar(32) DEFAULT NULL,
status_param_1 varchar(255) DEFAULT NULL,
status_param_2 varchar(255) DEFAULT NULL,
status_param_3 varchar(255) DEFAULT NULL,
started_at datetime DEFAULT NULL,
PRIMARY KEY (id),
KEY index_backup_jobs_on_state (state),
KEY index_backup_jobs_on_backup_profile_id (backup_profile_id),
KEY index_backup_jobs_created_at (created_at),
KEY idx_backup_jobs_state_updated_at (state,updated_at) USING BTREE,
KEY idx_backup_jobs_state_status_param_1_updated_at (state,status_param_1,updated_at) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=508748682 DEFAULT CHARSET=utf8;
发布表定义('SHOW CREATE TABLE tablename')和查询的解释('EXPLAIN SELECT count(*)...')。 – 2012-04-27 15:50:49
“它不给我正确的结果”:它是一个“CREATE INDEX”,它没有给出正确的结果或什么?你是什么意思? – Quassnoi 2012-04-27 15:58:16
当查询成功时,它会在COUNT(*)'中返回多少条记录? – Quassnoi 2012-04-27 16:07:01