簡介
以下是一些基本的,以體現索引功能的測試。
測試數據生成
以下參照PostgreSQL生成測試數據 進行。
創建表
CREATE TABLE test
(
id integer,
test integer
)
WITH (
OIDS=FALSE
);
ALTER TABLE test
OWNER TO postgres;
產生1500w個隨機數(0-1000),插入到表中,
insert into test SELECT generate_series(1,15000000) as key, (random()*(10^3))::integer;
查看錶的大小,大約爲500MB。
無索引測試
測試1–查找特定數據
- 測試語句:
select count(*) from test where test=200
執行計劃:
測試2–查找特定範圍的語句
- 測試語句:
select * from test where test >= 800
執行計劃:
測試3–排序測試
- 測試語句:
select * from test order by test
執行計劃:
有索引測試
在test字段,創建索引,創建完成後索引大小約爲300MB。
CREATE INDEX test6
ON test
USING btree
(test);
測試4–查找特定數據
- 測試語句:
select count(*) from test where test=200
執行計劃:
僅需12ms,相比較未創建索引時的1.8s,有了極大提升。
測試5–查找特定範圍的語句
- 測試語句:
select * from test where test >= 800
執行計劃:
顯示走了索引,耗時1.9s,與未創建索引所需2.0s相比,差別不大。
但調整測試語句:select * from test where test >= 200
,查看執行計劃
並未走索引,是因爲在返回記錄過多的情況下,此時使用索引查取記錄的開銷(硬盤隨機I/O)會很大,
所以仍然採用順序瀏覽的方式獲取記錄。
測試6–排序測試
- 測試語句:
select * from test order by test
執行計劃:
相比較未創建索引時的24s,此時採用索引後時間反而延長!
總結
- 對於查找特定條件的記錄,使用索引後查詢性能會大大提升
- 篩選條件的稍微改變,都有可能影響索引的使用,當返回數據量過多時,此時往往不會走索引
- 索引設置不當,可能反而延長查詢時間