我有一個簡單的ISAM表,有160萬條記錄。典型的查詢在3個索引列上有一個WHERE子句,並返回10,000個左右的記錄。出於這個問題的目的,我在做SELECT *,而我將ORDER BY放在外面。關於表的唯一不尋常的事情是它有1個大的非數字列VARCHAR(8192)。加速mySQL SELECT查詢,第一個查詢需要比下一個要長1000倍?
對於我用於這個問題的查詢,第一個查詢提交大約需要145秒,而後續提交需要大約2秒。該表在這個狀態下毫無價值,因爲我需要做的實際查詢在第一次提交時需要一個小時或更多時間。這看起來很荒謬,不管有多少磁盤I/O正在完成。當我使用我的查詢的INTO OUTFILE版本時,mySQL可以在很短的時間內將大量文件寫入磁盤...
我該如何修復此表?
#key_buffer_size=256M
#tmp_table_size=64M
#max_heap_table_size=64M
#myisam_sort_buffer_size=88M
#read_buffer_size=1M
#read_rnd_buffer_size=2M
回答問題時:
表約1.6 2.2GB萬條記錄。
速度:不需要快速,只需足夠快,以避免在等待時死於老年......現在需要5分鐘才能接受2分鐘。
通過返回的信息說明:
mysql> EXPLAIN SELECT /*+ MAX_EXECUTION_TIME(200000)*/ *
FROM tbl_skews
WHERE (skw_minute IN(43))
AND (tday_date >= 42767 AND tday_date <= 42838)
AND (skw_days > -10 AND skw_days < 70);
id 1
select_type SIMPLE
table tbl_skews
partitions NULL
type ref
possible_keys ndx_skews_tday_date,ndx_skews_skw_minute,ndx_skews_skw_days
key ndx_skews_skw_minute
key_len 2
ref const
rows 35396
filtered 1.51
Extra Using where
表定義:
CREATE TABLE IF NOT EXISTS `spx_opts`.`tbl_skews` (
`exp_true_date` INT NOT NULL,
`exp_subndx` TINYINT NOT NULL,
`tday_date` INT NOT NULL,
`skw_minute` SMALLINT NOT NULL,
`skw_TS_load` DOUBLE NOT NULL,
`tday_days_to_next` SMALLINT NOT NULL,
`tday_is_early_close` TINYINT NOT NULL,
`tday_open_time` DOUBLE NOT NULL,
`tday_close_time` DOUBLE NOT NULL,
`prs_opar_pmod` SMALLINT NOT NULL,
`prs_opar_yield` DOUBLE NOT NULL,
`prs_best_yield` DOUBLE NOT NULL,
`prs_best_pvdiv` DOUBLE NOT NULL,
`prs_rate_libor` DOUBLE NOT NULL,
`prs_rate_used` DOUBLE NOT NULL,
`prs_rate_implied1` DOUBLE NOT NULL,
`prs_rate_implied2` DOUBLE NOT NULL,
`prs_TS_min` DOUBLE NOT NULL,
`prs_TS_max` DOUBLE NOT NULL,
`prs_is_exp_linked` TINYINT NOT NULL,
`skw_is_chain_good` TINYINT NOT NULL,
`skw_TS` DOUBLE NOT NULL,
`skw_und_print` FLOAT NOT NULL,
`skw_days` DOUBLE NOT NULL,
`skw_ndx_m_pvdiv` DOUBLE NOT NULL,
`skw_vol_atm` DOUBLE NOT NULL,
`skw_cvix` DOUBLE NOT NULL,
`skw_stk_vol` VARCHAR(8192) NOT NULL,
PRIMARY KEY (`exp_true_date`, `exp_subndx`, `tday_date`, `skw_minute`),
INDEX `ndx_skews_tday_date` (`tday_date`),
INDEX `ndx_skews_skw_minute` (`skw_minute`),
INDEX `ndx_skews_skw_days` (`skw_days`))
ENGINE = MYISAM;
第二次查詢始終將更快,因爲會得到從緩存中的數據。性能問題應該包括'EXPLAIN ANALYZE'和一些關於表格大小,索引,當前時間表現,期望時間等的信息。'Slow'是一個相對術語,我們需要一個實際值來比較。 \t \t [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –
問題被編輯回答問題... – dts
編輯問題以使表格定義更清晰。 – dts