Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加速搜索查询(大连接表)_Php_Mysql_Performance_Junction - Fatal编程技术网

Php 加速搜索查询(大连接表)

Php 加速搜索查询(大连接表),php,mysql,performance,junction,Php,Mysql,Performance,Junction,我正在用PHP/MYSQL编写一个多存储webshop应用程序。products表有大约100万条记录,目前我有5家商店有所有的产品,大约3家商店有一些产品。产品的价格有时因商店而异。因为它应该可以添加或删除某些产品,比如说只有shop 2,所以我创建了一个连接表。我的桌子如下所示: products(id,name,description,price,media) ~1M records stores(id,name) products_stores(id,product_id,store_i

我正在用PHP/MYSQL编写一个多存储webshop应用程序。products表有大约100万条记录,目前我有5家商店有所有的产品,大约3家商店有一些产品。产品的价格有时因商店而异。因为它应该可以添加或删除某些产品,比如说只有shop 2,所以我创建了一个连接表。我的桌子如下所示:

products(id,name,description,price,media) ~1M records
stores(id,name)
products_stores(id,product_id,store_id,price) ~5M records
搜索产品时,查询大约需要20秒。我为产品(名称、描述)+产品商店(产品id、商店id)添加了索引。我有没有办法加快这个过程?产品商店中的大多数记录都是相同的(商店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
我只在name上添加了一个全文索引,并删除了orderby语句,但似乎没有什么区别。我现在的指数是:

Products(name) BTREE
Products(name,description) FULLTEXT
Products(name) FULLTEXT
以上查询说明如下:(带索引)


提前向您表示感谢,并对我的英语不好表示歉意。

请阅读以下有关群集主键的链接:

然后根据以下内容重新设计您的产品:

create table products_stores
(
store_id int unsigned not null,
product_id int unsigned not null,
...
primary key (store_id, product_id)
)
engine=innodb;

希望这对您有所帮助:)

因为您要从特定的商店中查找产品,我会在商店ID和名称上建立索引,然后调整查询以预先确认给定商店中的产品,而不是首先查看所有产品

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

您能给我们看一下需要20秒的查询吗?当然,我添加了查询。您可以在查询中添加换行符。这样做可能会让你的生活更轻松。:)请检查MySQL是否采用索引(查询执行计划:)后创建表产品。仅查看数据类型。名称或描述是否为“文本”类型?那么你应该使用: