2

今天,我的托管服务提供商告诉我必须立即阻止我的数据库。我有一个查询会在服务器上造成巨大的负载。您知道如何优化我的查询以减少服务器的负载吗?

SELECT `users`.`id`,
       `why_me`, 
       `created`,
       `thumbnail`,
       `rating_date`,
       CONCAT(first_name, ' ', last_name) AS name,
       SUBSTRING(why_me, 1, 27) as subwhy,
       COUNT(`rating_date`) AS total,
       MAX(`rating_date`) AS maxrate
  FROM (`user_profiles`)
  LEFT OUTER JOIN `rates` ON `user_profiles`.`id`=`rates`.`user_id`
  JOIN `users` ON `user_profiles`.`user_id`=`users`.`id`
  WHERE `users`.`activated` =  '1'
      AND `last_name` != ""
      AND `first_name` != ""
      AND  concat_ws(' ', first_name, last_name) COLLATE UTF8_GENERAL_CI  LIKE '%%'
  GROUP BY `user_profiles`.`user_id`
  ORDER BY `total` desc

我会很感激你的任何帮助。谢谢!

4

1 回答 1

1
AND  concat_ws(' ', first_name, last_name) COLLATE UTF8_GENERAL_CI  LIKE '%%'

没有效果但很昂贵(长时间运行)。它一一扫描所有行而不返回任何有用的信息。消除!

登录到 phpmyadmin 并在前面加上“ EXPLAIN ”运行此查询,即“EXPLAIN SELECT users...”。发布结果。它将向我们展示 SQL 是否可以直接寻址所需的行,或者它是否可以逐一搜索它们。注意行使用的键:如果它是空的,你需要额外的索引:

1) 确保您对用于连接的每一列都有一个索引,即rates.user_id 和user_profiles.user_id。

2) 确保你对用于具有高基数的 where 部分的所有内容都有 indeces ,即 first_name 和 last_name。

3) 更好:创建超过 3 列的索引:activated,first_name,last_name

4) GROUP 和 ORDER BY 导致临时表的构建。你能将其中的一些逻辑移植到 PHP中吗?

5)缓存结果。这不是实时完成的!

于 2013-05-31T09:29:25.627 回答