我正在用PHP / MYSQL编写一个多线程网店应用程序。产品表有大约一百万条记录,目前我有5家商店,其中包含所有产品,约有3家商店有少量产品。产品的价格有时因商店而异。因为应该可以添加或删除某些产品,我们只说商店2,我创建了一个联结表。我的表看起来像这样:
products(id,name,description,price,media) ~1M records
stores(id,name)
products_stores(id,product_id,store_id,price) ~5M records
搜索产品时,查询大约需要20秒。我在产品(名称,描述)+ products_stores(product_id,store_id)中添加了索引。有什么方法可以加快这个过程吗? products_stores中的大多数记录都是相同的(store_id除外),但我希望保持灵活性。
查询:
SELECT
Product.id,
Product.name,
Product.drager,
Product.import,
Product.price,
Product.description,
Product.units
FROM
products AS Product
INNER JOIN
products_stores AS ProductStore ON (
ProductStore.product_id = Product.id
AND
ProductStore.store_id =1
)
WHERE
name LIKE 'bach%'
ORDER BY
Product.description asc
LIMIT
500
我只在名称上添加了一个FULLTEXT索引并删除了ORDER BY语句,但似乎没有任何区别。我的指数现在是:
Products(name) BTREE
Products(name,description) FULLTEXT
Products(name) FULLTEXT
以上查询的EXPLAIN给出:(带索引) http://i.stack.imgur.com/8Fe8C.gif
提前致谢,抱歉我的英语不好。
答案 0 :(得分:0)
阅读以下有关群集主键的链接:
http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
MySQL and NoSQL: Help me to choose the right one
Any way to achieve fulltext-like search on InnoDB
How to avoid "Using temporary" in many-to-many queries?
60 million entries, select entries from a certain month. How to optimize database?
然后按照以下方式重新设计product_stores表:
create table products_stores
(
store_id int unsigned not null,
product_id int unsigned not null,
...
primary key (store_id, product_id)
)
engine=innodb;
希望这有助于:)
答案 1 :(得分:0)
因为您正在寻找特定商店的产品,我会在商店ID和名称上有一个索引,然后调整查询以预先确定来自给定商店的产品,而不是先查看所有产品。< / p>
SELECT STRAIGHT_JOIN
P.id,
P.name,
P.drager,
P.import,
P.price,
P.description,
P.units
FROM
Product_Stores PS
JOIN Products P
on PS.Product_ID = P.ID
AND P.Name like 'back%'
WHERE
PS.Store_ID = 1
order by
P.Description
limit
500