【发布时间】:2014-07-03 19:56:59
【问题描述】:
我在书籍和流派之间建立了多对多的关系。例如,“霍比特人”书可能有“儿童”、“小说”和“奇幻”等类型。
这是架构:
CREATE TABLE "genre" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(50) NOT NULL
)
;
CREATE TABLE "book_genres" (
"book_id" integer NOT NULL REFERENCES "book" ("id"),
"genre_id" integer NOT NULL REFERENCES "genre" ("id"),
CONSTRAINT book_genres_pkey PRIMARY KEY (book_id, genre_id)
)
;
CREATE TABLE "book" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(255) NOT NULL,
"price" real NOT NULL
)
;
还有索引:
CREATE INDEX "book_genres_36c249d7" ON "book_genres" ("book_id");
CREATE INDEX "book_genres_33e6008b" ON "book_genres" ("genre_id");
CREATE INDEX "book_5a5255da" ON "book" ("price");
行数:
- 类型:30
- book_genres:800,000
- 图书:200,000
我正在尝试在 SQL 中编写一个查询,它可以返回按价格排序的特定类型的所有书籍,而不会重复。
这是我的查询:
SELECT name, price
FROM book
WHERE book.id
IN
(SELECT book_id
FROM book_genres
WHERE genre_id = 1
OR genre_id = 2)
ORDER BY price LIMIT 10
我的问题是性能。此查询最多可能需要 2000 毫秒才能执行。我怎样才能提高性能?
我可以完全控制数据库(Postgres 9.3),因此可以添加视图、索引或非规范化。我也在使用 Django,因此可以使用 Python/Django 在内存中执行多个查询执行操作。
【问题讨论】:
标签: sql database postgresql join schema