I'm writing a multistore webshop application in PHP/MYSQL. The products table has about a million records, currently i'm having 5 stores with all products in it and about 3 stores with a few products. The product's price sometimes varies from store to store. Because it should be possible to add or delete certain products for let's say only shop 2, i created a junction table. My tables looks like this:
products(id,name,description,price,media) ~1M records
stores(id,name)
products_stores(id,product_id,store_id,price) ~5M records
When searching for products the query takes about 20 seconds. I added indices to products(name,description) + products_stores(product_id,store_id). Is there any way I could speed up the process? Most of the records in products_stores are the same (except for the store_id), but I'd like to keep it flexible.
The query:
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
I added a FULLTEXT index on only name and deleted the ORDER BY statement, but it seems to make no difference. My indices are now:
Products(name) BTREE
Products(name,description) FULLTEXT
Products(name) FULLTEXT
EXPLAIN of the above query gives: (with indices) https://i.sstatic.net/8Fe8C.gif
Thanks in advance and sorry for my bad English.
read the following links about clustered primary keys:
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?
then redesign your product_stores table something along the lines of:
create table products_stores
(
store_id int unsigned not null,
product_id int unsigned not null,
...
primary key (store_id, product_id)
)
engine=innodb;
hope this helps :)