doudun8705 2017-04-20 18:22
浏览 38

库存慢SQL查询

I have been working with the same SQL query for a couple of hours and it is finally working. But, it is very slow.. I have been trying to optimize it, but no luck, any help. Here is the query (Lots of left joins...):

 $sql ="SELECT u.id, u.display_name, IFNULL(SUM(r.total_rating)/COUNT(r.total_rating), 0) AS avg_rating, s.title AS study FROM users u
  LEFT JOIN rating r ON u.id = r.user_id 
  LEFT JOIN usermeta m ON u.id = m.user_id
  LEFT JOIN usermeta m1 ON u.id = m1.user_id
  LEFT JOIN studies s ON m.meta_value = s.id
  WHERE m.meta_key = 'study' AND m1.meta_key = 'subjects' AND m1.meta_value REGEXP '$subjectsvalues'
  GROUP BY u.id, r.total_rating
  ORDER BY avg_rating DESC
  LIMIT 10";

Table structure for user table:

id | display_name | email
-------------------------
 1 | Khar         | ...
 2 | SantaCruz    | ...

Table structure for rating table:

id | rating_title | total_rating  | user_id
-------------------------------------------
 1 | dffd         | 5             | 1
 2 | fddfdffdd    | 4             | 1

Table structure for usermeta table:

id | user_id | meta_key  | meta_value
-------------------------------------
 1 | 1       | study     | 132
 2 | 1       | subjects  | 121,231

Table structure for studies table:

id | title
----------
 1 | dsdsf
 2 | sdfdf

Subject values are handled like so:

$subjectsvalues = '';

$subjects = explode(",", $subjects);
foreach($subjects as $val) {
    $subjectsvalues = $subjectsvalues.",".$val.",|";
}
$subjectsvalues = $subjectsvalues."notdata";
  • 写回答

2条回答 默认 最新

  • duanlu1908 2017-04-20 18:30
    关注

    First, left joins are unnecessary. So try this:

    SELECT u.id, u.display_name, AVG(r.total_rating) AS avg_rating, s.title AS study
    FROM users u JOIN
         rating r
         ON u.id = r.user_id JOIN
         usermeta m
         ON u.id = m.user_id JOIN
         usermeta m1 
         ON u.id = m1.user_id JOIN
         studies s
         ON m.meta_value = s.id
    WHERE m.meta_key = 'study' AND m1.meta_key = 'subjects' AND m1.meta_value REGEXP '$subjectsvalues'
    GROUP BY u.id, r.total_rating
    ORDER BY avg_rating DESC
    LIMIT 10;
    

    Then, I would be inclined to try indexes on usermeta(meta_key, user_id, meta_value). I assume the main ids in the tables are all primary keys.

    评论

报告相同问题?

悬赏问题

  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私