說我有一個代表一個固定深度的層次結構是這樣的模式:SQL:如何在基於外部數據過濾行時提高性能?
CREATE TABLE level0 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL
)
CREATE TABLE level1 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL,
level0_id INTEGER NOT NULL
)
CREATE TABLE level2 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL,
level1_id INTEGER NOT NULL,
is_important INTEGER
)
CREATE INDEX level2_level1_id ON level2 (level1_id)
CREATE INDEX level1_level0_id ON level1 (level0_id)
(只給規模感,假設1000 rowsin 0級,2000年在1級,並在level2的20000,這是一個sqlite數據庫在手機的SD卡上。0級查詢返回1000行,1級查詢返回1-30行,2級查詢返回1-20行)
我一次只顯示一個層次的層次結構。所以我對每個顯示三個級別的查詢是這樣的:
SELECT id,text FROM level0
SELECT id,text FROM level1 WHERE level0_id = 12345
SELECT id,text FROM level2 WHERE level1_id = 23456
簡單,快速,全面的索引。現在,我還想顯示相同的層次結構,但我想根據is_important進行過濾。我只想顯示level0和level1行,最終導致level2行,is_important = 1。
因此,我寫了一些新的查詢,與舊的很不同。
level 0:
SELECT DISTINCT l0.id,l0.text
FROM level2 AS l2
INNER JOIN level1 AS l1 ON l1.id = l2.level1_id
INNER JOIN level0 as l0 on l0.id = l1.level0_id
WHERE l2.is_important = 1
level 1:
SELECT DISTINCT l1.id,l1.text
FROM level2 AS l2
INNER JOIN level1 AS l1 ON l1.id = l2.level1_id
WHERE l2.is_important = 1
level 2:
SELECT id,text FROM level2 WHERE level1_id = 23456 AND is_important = 1
0級和1級查詢明顯比上面未過濾的查詢慢很多很多。我明白他們爲什麼很慢,但我在改善他們的表現時遇到了麻煩。
我覺得奇怪的是,通過走最大的表來提取較小的表,這似乎是用SQL可以理解的方式表達我想要的最簡潔自然的方式。
所以我的問題是這樣的:你將如何提高過濾的0級和1級查詢的性能?
謝謝。這加快了一點。 – blucz 2010-08-17 22:11:06