Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
根据在单个列中排序的值排列指向行的指针。复合索引存储基于多个列的顺序。索引主要用于对其明确定义的范围进行操作,以便在从所指向的行检索数据之前获取大部分信息。索引通常不知道同一表上的其他索引,因此它们很少合并。当没有更多的信息可以从索引中获取时,MySQL开始直接对数据进行操作_Mysql_Query Optimization - Fatal编程技术网

根据在单个列中排序的值排列指向行的指针。复合索引存储基于多个列的顺序。索引主要用于对其明确定义的范围进行操作,以便在从所指向的行检索数据之前获取大部分信息。索引通常不知道同一表上的其他索引,因此它们很少合并。当没有更多的信息可以从索引中获取时,MySQL开始直接对数据进行操作

根据在单个列中排序的值排列指向行的指针。复合索引存储基于多个列的顺序。索引主要用于对其明确定义的范围进行操作,以便在从所指向的行检索数据之前获取大部分信息。索引通常不知道同一表上的其他索引,因此它们很少合并。当没有更多的信息可以从索引中获取时,MySQL开始直接对数据进行操作,mysql,query-optimization,Mysql,Query Optimization,也就是说,日期索引不能使用产品标识上的索引,但是(日期,产品标识)上的索引可以在日期条件(针对特定日期匹配按产品标识排序)之后获得更多关于产品标识的信息 然而,日期(>=)上的范围条件打破了这一点。这就是我说的 UPD2: 据我所知,问题可以归结为(大部分时间用于此): 现在,在用户和产品上添加索引(用户id、先前登录)和(日期),并尝试以下查询: SELECT STRAIGHT_JOIN p.*, shop FROM ( SELECT product_id, shop FROM use

也就是说,日期索引不能使用产品标识上的索引,但是(日期,产品标识)上的索引可以在日期条件(针对特定日期匹配按产品标识排序)之后获得更多关于产品标识的信息

然而,日期(>=)上的范围条件打破了这一点。这就是我说的

UPD2:

据我所知,问题可以归结为(大部分时间用于此):

现在,在用户和产品上添加索引(用户id、先前登录)和(日期),并尝试以下查询:

SELECT STRAIGHT_JOIN p.*, shop
FROM (
  SELECT product_id, shop
  FROM users u
  JOIN products p
    user_id = 22 AND p.`date` >= prior_login
  JOIN shops s
    ON p.shop_id = s.shop_id
  ORDER BY shop, p.`date`, product_id
) as s
JOIN products p USING (product_id);


如果我是正确的,查询应该返回相同的结果,但更快。如果您能发布查询的解释结果,那就太好了。

谢谢,我在上面添加了一个解释计划,现在将测试您的查询。您的查询只生成7个结果,而不是原来的497个。我认为这是因为WHERE子句,它将结果限制为仅在以下情况下(f1.fan_id=22或fav1.user_id=22)的结果,而大多数产品不会出现这种情况。如果我移动这些条件以使它们成为
LEFT JOIN friends f1
声明的一部分,则当用户喜欢某个产品时,我似乎得到了该产品的一个重复行(即两行,圆圈用户名作为该产品的会话用户),这在原始查询中没有发生。查询花了3.7秒。在解释计划中,我并没有看到任何让我觉得离谱的东西。我的建议是逐表构建查询,并找出导致性能损失最大的原因。这不会花太长时间,因为您已经有了一个功能查询。我按照您的建议,在删除
按产品id、日期排序的订单时,发现执行时间变为0.06秒。(如果我按product_id、date或两者进行订购,查询所需的时间大约相同,超过3秒。)我有product_id和date的索引,因此我不知道如何解决这个问题。您是否有product_id和date的组合索引(列顺序关系,所以尝试两者),这与product_id和date的单独索引不同谢谢,我在上面添加了一个解释计划,将测试您的查询。您的查询只生成7个结果,而不是原来的497个。我认为这是因为WHERE子句,它将结果限制为仅在以下情况下(f1.fan_id=22或fav1.user_id=22)的结果,而大多数产品不会出现这种情况。如果我移动这些条件以使它们成为
LEFT JOIN friends f1
声明的一部分,则当用户喜欢某个产品时,我似乎得到了该产品的一个重复行(即两行,圆圈用户名作为该产品的会话用户),这在原始查询中没有发生。查询花了3.7秒。在解释计划中,我并没有看到任何让我觉得离谱的东西。我的建议是逐表构建查询,并找出导致性能损失最大的原因。这不会花太长时间,因为您已经有了一个功能查询。我按照您的建议,在删除
按产品id、日期排序的订单时,发现执行时间变为0.06秒。(如果我按product_id、date或两者进行订购,查询所需的时间大约相同,超过3秒。)我有product_id和date的索引,因此我不知道如何解决此问题。您是否有product_id和date的组合索引(列顺序很重要,所以请尝试两者)这与在product_id和dateI上有单独的索引不同,我在上面添加了一个解释计划。在日期和登录前添加索引并没有改变执行时间。我在上面添加了一个解释计划。在日期和登录前添加索引不会改变执行时间。顺便问一下,您需要在
上排序的多个product\u id行来自哪里?circle\u favorited
?@newtover用户的多个朋友可以喜欢同一个产品,因此,每个喜欢具有给定产品id的产品的不同朋友都会生成一个包含该产品id(以及朋友的用户名)的新行。收藏夹表中的每一行都包含一个用户id和一个二进制收藏夹值。如果该值为0,则表示用户否决了该产品。如果该值为1,则用户投票支持该产品。我按circle\u favorited进行排序,以便将投票支持该产品的用户与投票反对该产品的用户分开。顺便问一下,您需要在
circle\u favorited
上排序的多个产品id行来自何处?@newtover用户的多个朋友可以喜欢同一产品,因此,每个喜欢具有给定产品id的产品的不同朋友都会生成一个包含该产品id(以及朋友的用户名)的新行。收藏夹表中的每一行都包含一个用户id和一个二进制收藏夹值。如果该值为0,则表示用户否决了该产品。如果该值为1,则用户投票支持该产品。我按circle_favorited进行排序,以区分投票支持产品的用户和投票反对产品的用户。如果我当时理解正确,问题是如果我想使用products.date上的索引,我不能同时使用products.date来限制结果。我非常有兴趣学习如何不按顺序进行排序。到目前为止,我还不明白。另外,我很好奇为什么
按产品订购\u id
也会导致瓶颈,尽管
products.date>=
比较中没有涉及到这一点。幸运的是,该查询与原始查询运行速度相同,大约3.5秒。我确实创建了一个索引('sh
id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  u   const   PRIMARY,prior_login,user_id PRIMARY 4   const   1   Using temporary; Using filesort
1   SIMPLE  s   ALL PRIMARY NULL    NULL    NULL    90   
1   SIMPLE  p   ref shop_id,date,shop_id_2,shop_id_3    shop_id 4   bitt3n_minxa.s.shop_id  5338    Using where
SELECT p.*, shop 
  FROM 
  (
    SELECT p.*
    FROM products p 
    WHERE p.date >= (select prior_login FROM users where user_id = 22)
  ) as p
  JOIN shops s 
    ON p.shop_id = s.shop_id
  ORDER BY shop, date, product_id;
SELECT SQL_SMALL_RESULT p . * , shop
FROM products p
INNER JOIN shops s ON p.shop_id = s.shop_id
WHERE p.date >= ( 
SELECT prior_login
FROM users
WHERE user_id =22 ) 
ORDER BY shop, DATE, product_id;
SELECT shop,
       shops.shop_id AS shop_id,
       products.product_id AS product_id,
       brand,
       title,
       price,
       image AS image,
       image_width,
       image_height,
       0 AS sex,
       products.date AS date,
       fav1.favorited AS circle_favorited,
       fav2.favorited AS session_user_favorited,
       u2.username AS circle_username
  FROM products
       LEFT JOIN favorites fav2
          ON     fav2.product_id = products.product_id
             AND fav2.user_id = 22
             AND fav2.current = 1
       INNER JOIN shops
          ON shops.shop_id = products.shop_id
       INNER JOIN users u1
          ON products.date >= u1.prior_login AND u1.user_id = 22
       LEFT JOIN favorites fav1
          ON products.product_id = fav1.product_id
       LEFT JOIN friends f1
          ON f1.star_id = fav1.user_id
       LEFT JOIN users u2
          ON fav1.user_id = u2.user_id
 WHERE f1.fan_id = 22 OR fav1.user_id = 22
ORDER BY shop,
         DATE,
         product_id,
         circle_favorited
SELECT p.*, shop
FROM products p
JOIN users u ON p.`date` >= u.prior_login and u.user_id = 22
JOIN shops s ON p.shop_id = s.shop_id
ORDER BY shop, `date`, product_id;
SELECT STRAIGHT_JOIN p.*, shop
FROM (
  SELECT product_id, shop
  FROM users u
  JOIN products p
    user_id = 22 AND p.`date` >= prior_login
  JOIN shops s
    ON p.shop_id = s.shop_id
  ORDER BY shop, p.`date`, product_id
) as s
JOIN products p USING (product_id);