Задавайте вопросы, мы ответим
Вы не зашли.
добрый вечер, ситуация такая, сделал запрос вписал индексы, сам запрос долговатый, хотел узнать ваше мнение
$arr = mysql_query("SELECT t.id,
t.name,
t.descr,
t.banner,
t.month_vote,
t.month_votenum,
t.month_hits,
COUNT(ratings.id) AS vote,
SUM(ratings.rating_num) AS votenum
FROM
tracker AS t
LEFT JOIN ratings ON rating_id = t.id
WHERE DATE_FORMAT(ratings.added, '%Y-%m') = '$year-$select'
GROUP BY t.id ORDER BY vote DESC") or die(mysql_error());
запрос идет циклом, индексы поставил для tracker(id,name,descr,banner,mothn_vote,month_votenum,month_hit) и для ratings(id,rating_num,added)
что я сделал не прально и что тут можно оптимизировать?
заранее спасибо!
Неактивен
Индексы таблицы `ratings`:
1. `added`
2. `rating_id`
Запрос:
Неактивен
спасибо за пример!
придется делать отдельную табличку так как записей в ratings очень много, на данный момент 115267 и с каждым днем растет, отуда и тормознутость запроса.
Неактивен
Что-то я никак не могу понять смысл этого запроса
Если нужно достать «те сиды, которые имеют рейтинги за этот месяц», то лучше найти
рейтинги, а потом уже сиды (у Вас получается наоборот, из-за left join):
Неактивен
спасибо огромное помогло!!!
еще вопрос в правильности использования индексов, к примеру есть такой просто запрос
$arr2 = mysql_query("SELECT id, name, descr FROM tracker ORDER BY votenum DESC LIMIT 10") or die(mysql_error());
который идет циклом, как я прально понимаю я делаю индекс на (id, name , descr) а вот на сортировку нужно указывать votenum???
Неактивен
В этом запросе нужен только индекс на поле `votenum`. А зачем он идёт циклом?
Неактивен
как зачем вывод топ10, так оказывается на на выборку индекс не нужен?
Неактивен
Нужен, если есть ограничения выборки и не во всех случаях.
XJIOP написал:
как зачем вывод топ10
Ну так это 1 запрос.
Отредактированно coin (01.03.2009 02:13:07)
Неактивен
не я не прально выразился не запрос идет циклом а выборка точнее while ($row = mysql_fetch_assoc($res)) {}
я просто нигде не могу найти нормальный подробный док с примерами на индексы, сайт сделал а теперь нужно оптимизировать запросы в индексах.
кстати тут ограничение LIMIT в 10
Отредактированно XJIOP (01.03.2009 02:26:12)
Неактивен
Этот цикл на скорость выполнения запроса не влияет, в это время сам запрос уже выполнен.
http://dev.mysql.com/doc/refman/5.1/en/ … cture.html
XJIOP написал:
кстати тут ограничение LIMIT в 10
Я имел ввиду ограничения секции WHERE.
Отредактированно coin (01.03.2009 02:29:20)
Неактивен
спасибо выручил! начинаю изучать ))
Неактивен
а еще вопрос чтобы не создавать отдельную тему.
нужно сделать такой запрос чтобы узнать на какой позиции данный юзер из всех юзеров, с учетом того что сортировать будет по кол. голосов ORDER BY month_vote DESC
тоесть к примеру зайду в профиль юзеру и увижу что он на 5 месте из 230 юзеров по такой сортировке.
долго голову ломал и сумел сделать такой запрос
$arr = mysql_query("SELECT COUNT(*), id FROM tracker GROUP BY id ORDER BY month_vote DESC") or die(mysql_error());
вроде бы ничего но в самом последнем юзере показывает счетчик не верно, все остальное вроде ок.
Отредактированно XJIOP (01.03.2009 03:43:12)
Неактивен
Ваш запрос будет давать одинаковый результат для любого юзера, так как в нем нет условия на выборку для конкретного юзера.
В предположении, что юзер определяетяс по id:
Неактивен
круто спасибо, такой запрос уже не для моих мозгов ))) вот только не понял как вывести значение SET @a=0; в пхп
спасибо разобрался mysql_query("SET @a=0"); а индекс я так понимаю month_vote и id, вот только еще отдельный запрос нада будет делать на count(*) что бы знать сколько всего юзеров.
эх неработает =/
mysql_query("SET @a=0");
$row = mysql_query("SELECT pos FROM (SELECT @a:=@a+1 AS pos, id, month_vote FROM tracker ORDER BY month_vote DESC) t WHERE id = $id AND month_vote != '0'") or die(mysql_error());
$arr = mysql_fetch_assoc($row);
первые 2 позиции показывает верно а дальше 3 место выдает за 6 а 6 за 3 путаница получилась.
Отредактированно XJIOP (01.03.2009 05:52:56)
Неактивен
Количество записей, стоящих в рейтинге выше id=123:
Неактивен
спасибо разобрался ))
начал изучать индексы, все вроде понятно но не понятно только одно, какие индексы указывать в связке LEFT JOIN на первую выборку
к примеру запрос такой:
$res = mysql_query("SELECT afisha.*,
users.class,
users.username,
IF( ISNULL(countries.flagpic) <> 0, '', CONCAT('<img src=\"".$GLOBALS['pic_base_url']."/flag/', countries.flagpic, '\" title=\"', countries.name, '\" width=\"', 20, '\">') ) AS flag,
categories.name,
countries.id AS countid
FROM afisha
LEFT JOIN users ON users.id = afisha.userid
LEFT JOIN countries ON countries.id = afisha.land
LEFT JOIN categories ON categories.id = afisha.razdel
ORDER BY added DESC $limit") or die(mysql_error());
я должен ставить индекс только на added или же userid,land,razdel,added для таблицы afisha? и второе для этих LEFT JOIN тут понятно к примеру users.id там индекс примари для него уникальный а еслиб был бы не ид а другое значение для него тож индекс нужен был бы?
ps: извиняюсь за такое кол. вопросов, просто хочу понять всю систему иднксации.
Неактивен
разобрался http://www.phpclub.ru/detail/article/mysql_optimize ))
Неактивен
помогите с запросом
Неактивен
У вас в условии проверяется не значение самого индексного поля, а результат вычисления функции, который к индексу имеет косвенное отношение.
Неактивен