Ускорить поисковый запрос (большая таблица соединений) - PullRequest
0 голосов
/ 25 октября 2011

Я пишу мультимагазиновое приложение для интернет-магазина на 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

ОБЪЯСНЕНИЕ вышеуказанного запроса дает: (с индексами) http://i.stack.imgur.com/8Fe8C.gif

Заранее спасибо и извините за мой плохой английский.

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Поскольку вы ищете товары из определенного магазина, у меня будет индекс по идентификатору магазина и названию, а затем настройте запрос так, чтобы предварительно квалифицировать товары из данного магазина вместо того, чтобы сначала просматривать все товары.

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
0 голосов
/ 25 октября 2011

прочитайте следующие ссылки о кластерных первичных ключах:

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 и NoSQL: помогите выбрать правильный

Любой способ добиться полнотекстового поиска в InnoDB

Как избежать «использования временных» в запросах «многие ко многим»?

60 миллионов записей, выберите записи за определенный месяц. Как оптимизировать базу данных?

затем измените дизайн таблицы 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;

надеюсь, это поможет:)

...