我有一張超過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