Должен ли я использовать (выберите count (id) из table2) в качестве col1, или я должен сохранить счетчик в таблице 1 и увеличить его на вставках? - PullRequest
0 голосов
/ 10 ноября 2011

Моя страница кажется медленной, у меня есть страница, которая имеет по крайней мере 20 запросов "счетчик выбора", каждая строка имеет по крайней мере два поля, составляющих подзапрос подсчета. Я думал, что это не будет так медленно, теперь я не уверен. Я хочу знать, какой метод по умолчанию для подобных ситуаций. (Если мне нужно проиндексировать некоторые столбцы, я тоже хочу решить, какой столбец, но функция count подсчитывает идентификаторы из некоторой таблицы, так что я тоже не думаю, что это постоянная проблема. "

if(isset($_GET["me"])) $me="and post.memberid=".$_SESSION["memberid"]; else $me="";
$votecount="(select count(voteid) from vote where vote.postid=post.postid) as cv";
$commentcount="(select count(commentid) from comment where comment.postid=post.postid) as cc";
$countagree="(select count(voteid) from vote where vote=1 and vote.postid=post.postid) as ca";
$ismyvote=sprintf("(select vote from vote where memberid=%s and vote.postid=post.postid) as mvote",$_SESSION["memberid"]);
$plq=sprintf("select *, %s,%s,%s,%s from post where post.dateposted>=NOW() - INTERVAL %s day %s",$votecount,$commentcount,$countagree,$ismyvote,$since,$me);

Когда я начал разрабатывать это, я думал, что mysql будет кэшировать счетчики полей первичного ключа, и это не вызовет никаких проблем.

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

Вы делаете 3 отдельных запроса за голосование и 2 других запроса за комментарий и публикацию, а также используете подзапросы ... Это плохо.

Может быть, вы можете сделать что-то вроде этого:

select
  post.*, 
  count(vote.voteid), 
  count(comment.commentid) 
from 
  vote, post, comment
where
  vote.postid=post.postid and
  comment.postid=post.postid and
  vote=1 and vote.postid=post.postid and
  memberid=$_SESSION["memberid"] and vote.postid=post.postid and
  post.dateposted>=NOW() - INTERVAL %s day and post.memberid=".$_SESSION["memberid"]"

Вероятно, это не работает, и вам нужно будет исправить некоторые вещи, но этот способ позволит dbms выполнить некоторые оптимизации плана запросов для вас, и, вероятно, будет быстрее.

1 голос
/ 10 ноября 2011

Я бы попробовал как запрос Вика, так и подход счетчика столбца Данихпа. Время и сравнить результаты - на основе ваших фактических данных и приложения.

Однако я верю, что реальный ответ, который поможет вам больше всего, - это по-настоящему выучить и использовать план объяснения (если вы этого еще не сделали)

http://en.wikipedia.org/wiki/Explain_Plan.

Вы упомянули "казалось, что это медленно" и "я думал, что это не будет так медленно, теперь я не уверен". и "так что я тоже не думаю, что это проблема с индексацией".

Так что кажется, что внесение изменений будет очень пробным и ошибочным, если вы действительно не будете измерять результаты своих изменений и объясните, что план поможет с этим, а также с индексами и многим другим.

Удачи!

0 голосов
/ 10 ноября 2011

Выбор счетчика может заблокировать всю таблицу. Вы можете использовать счетчик на другом столе. Но лучшим решением является использование автоинкрементного поля типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...