Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Оптимизация запроса MySQL

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6

Открыть новую тему     Написать ответ в эту тему

ROMAHi4

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как эти два запроса преобразовать в один ?

Код:
 
$arr_t = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS cnt FROM users WHERE userid=$userid"));
$arr_s = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS cnt2 FROM users WHERE userid=$userid AND isreader='yes'"));
$first = $arr_t["cnt"];
$second = $arr_s["cnt2"];
 

Всего записей: 35 | Зарегистр. 16-02-2007 | Отправлено: 17:13 16-03-2007
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ROMAHi4
http://dev.mysql.com/doc/refman/5.0/en/union.html

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 17:16 16-03-2007
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Так случилось, что для меня очень остро встал вопрос оптимизации обращений к базе данных. Оптимизацию начал изучать с нуля. Когда изучаешь, легче идёт, когда задаёшь вопросы по ходу. Вот первый из них -  
Получается, что в MySQL задействовано индексирование всегда, даже, если не используется директива USE UNDEX в запросе?

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 09:06 28-10-2009 | Исправлено: israel_rider, 09:11 28-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не индексирование а индексы наверное? если есть эти самые индексы и нет директивы IGNORE INDEX (...) то да

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 09:19 28-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Следовательно, мой шанс найти зависающий запрос - это проанализировать эти индексы, и задействовать их по свойму, более рационально....
И для этого - команды SHOW INDEXES и EXPLAIN мне в руки....  
Вроде так.... Пока, правильно понимаю политику партии?
 
 
Добавлено:
Стоп. Фразу :

Цитата:
если есть эти самые индексы  

не понял.  
 
Добавлено:
Видимо, индекс ко данному конкретному полю может быть, а может и не быть. Следовательно, надо разобаться, как назначать этот самый индекс. Плюс - выбирать необходимые поля для этого.  
Поскольку, как я пока понимаю, я не могу назначать индекс всем полям подряд, во всех таблицах подряд. Тогда я действительно окончательно добью свою базу....

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 09:33 28-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://www.mysql.ru/docs/man/MySQL_indexes.html
http://www.kurepin.ru/php/index/
http://www.instanceof.ru/mysql/indexes-in-mysql

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 10:27 28-10-2009 | Исправлено: andead, 10:29 28-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
andead! Класс! Я тоже юзал Гугл, но таких классных статей не нашёл. Огромный сенкс!
 
Добавлено:
"Однако в случае, когда необходим доступ почти ко всем 1000 строкам, быстрее будет последовательное чтение, так как при этом не требуется операций поиска по диску. "
Принципиальнейший момент! Причём, я это уже когда то читал. И потом благополучно забыл...
 
Добавлено:
"Как только к вашей базе обратятся сотни человек, так ваши тысячи записей тут же превратятся для движка баз данных в миллионы! И ваш провайдер совершенно резонно сделает вам замечание." -  Это именно то, что со мной и произошло. Только это не провайдер обратился, а сайт стал падать, показывая "Сервер Ерроу".
 
Добавлено:
Лыжи не едут.
Почему строка -
$result = mysql_query("EXPLAIN SELECT * FROM `tbl_photos`") or die("Invalid query: " . mysql_error());
Работает как обычный запрос? Я же написал волшебное слово "EXPLAIN", как учили!

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 10:58 28-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в phpMyAdmin забейте этот запрос

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 12:28 28-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Да, вывело. Теперь ещё надо разобраться в том, что вывело.  
То есть, получается, директива "EXPLAIN" работает в общем случае только из под Shell?
Из под РНР скриптов это не запуститься?

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 12:39 28-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
должно и из под php запускаться

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 13:24 28-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Тогда вообще ни чего не понял.... Как же мне запустить из под РНР то, что у меня сработало из под phpMyAdmin -  
EXPLAIN SELECT * FROM `tbl_photos

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 13:27 28-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
$result = mysql_query("EXPLAIN SELECT * FROM tbl_photos);
print_r(mysql_fetch_assoc($result));

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 13:43 28-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Да, спасибо большое, теперь всё вывелось.

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 14:34 28-10-2009
zerkms

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Как только к вашей базе обратятся сотни человек, так ваши тысячи записей тут же превратятся для движка баз данных в миллионы!

какой волшебный и глупый вывод.

----------
tvfёdor - оперативно уведомляет о раздачах rutracker | Блог об иммиграции в Новую Зеландию

Всего записей: 387 | Зарегистр. 07-05-2004 | Отправлено: 05:34 29-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
EXPLAIN SELECT pto.* , photogr.id_imageaccess FROM tbl_photos AS `pto` , tbl_photographers as `photogr` WHERE ( pto.keywords LIKE '%tel%' OR pto.location LIKE '%tel%' OR pto.photo_id LIKE '%tel%' ) AND pto.photographer_id = photogr.photographer_id AND pto.status = 1 ORDER BY pto.rating DESC

вывело мне:
id     select_type     table     type     possible_keys       key       key_len     ref     rows     Extra  
1      SIMPLE             pto       ALL    photographer_id    NULL      NULL      NULL    15708    Using where; Using filesort
1      SIMPLE           photogr    eq_ref    PRIMARY       PRIMARY    4     images2.pto.photographer_id    1      
 

Код:
SHOW INDEXES FROM `tbl_photos`

вывел мне:
Table     Non_unique     Key_name     Seq_in_index     Column_name     Collation     Cardinality     Sub_part     Packed     Null     Index_type    
tbl_photos    0    PRIMARY              1    photo_id               A    15708    NULL    NULL             BTREE      
tbl_photos    1    sub_cat_id            1    sub_cat_id            A     392      NULL    NULL     YES    BTREE      
tbl_photos    1    campaign_id         1    campaign_id          A        3       NULL    NULL    YES    BTREE      
tbl_photos    1    photographer_id    1    photographer_id     A    201       NULL    NULL    YES    BTREE      
tbl_photos    1    main_cat_id          1    main_cat_id            A    14        NULL    NULL    YES    BTREE      
tbl_photos    1    shortdesc              1    shortdesc            NULL    1        NULL    NULL    YES    FULLTEXT      
tbl_photos    1    shortdesc              2    longdesc              NULL    1       NULL    NULL    YES    FULLTEXT      
tbl_photos    1    shortdesc              3    location                NULL    1       NULL    NULL    YES    FULLTEXT      
tbl_photos    1    shortdesc              4    keywords             NULL    1        NULL    NULL    YES    FULLTEXT      
 
Вопрос. Я вижу, что последние четыре индекса не используются. И в то же время они типа FULLTEXT. Правильно ли я думаю, что их имеет смысл удалить вообще, поскольку идексы «FULLTEXT» жрут больше всего ресурсов?
 

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 23:28 29-10-2009 | Исправлено: israel_rider, 23:35 29-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider
если по этим полям осуществляется полнотекстовый поиск, то не нужно ничего удалять

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 08:27 30-10-2009 | Исправлено: andead, 08:52 30-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
andead! Плиз! Только на Вас вся надежда! Вроде нашёл узкое место.... Запрос :

Код:
 EXPLAIN SELECT photo_id, SUM(watch_count) AS `total_watch_count` FROM `tbl_viewed` WHERE photo_id IN (SELECT photo_id FROM tbl_photos WHERE status = 1) AND `timeviewed` > 1225353785 GROUP BY `photo_id` ORDER BY `total_watch_count` DESC LIMIT 0 , 10

стабильно вешает всё наглухо! То есть даже директиву «EXPLAIN» к этому запросу я посмотреть не могу.  
Вопрос! Как переписать запрос:

Код:
 SELECT photo_id, SUM(watch_count) AS `total_watch_count` FROM `tbl_viewed` WHERE photo_id IN (SELECT photo_id FROM tbl_photos WHERE status = 1) AND `timeviewed` > 1225353785 GROUP BY `photo_id` ORDER BY `total_watch_count` DESC LIMIT 0 , 10

, что бы он был оптимизирован хоть как то? Может его разбить на два запроса как то….?
Тогда потом я смогу выполнить директиву «EXPLAIN», что бы знать, как двигаться дальше. Пока я и этого не могу сделать!

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 11:25 30-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
попробуйте так

Код:
EXPLAIN SELECT photo_id, SUM(watch_count) AS `total_watch_count` FROM `tbl_viewed`
LEFT JOIN tbl_photos ON tbl_viewed.photo_id = tbl_photos.photo_id
WHERE
    tbl_photos.status = 1 AND
    `timeviewed` > 1225353785
GROUP BY `photo_id`
ORDER BY `total_watch_count` DESC LIMIT 0, 10

 
у вас в tbl_viewed заносятся данные о просмотре простым инсертом? о_О

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 11:33 30-10-2009 | Исправлено: andead, 11:35 30-10-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Да, сделал. Только поменял  
SELECT photo_id, SUM(watch_count) AS `total_watch_count` FROM `tbl_viewed`  
на
SELECT tbl_viewed.photo_id, SUM( watch_count ) AS `total_watch_count`
Сейчас думаю.... по логике скорее должен стоять райт джойнт, так что в результате:

Код:
 
SELECT tbl_viewed.photo_id, SUM( watch_count ) AS `total_watch_count`  
FROM `tbl_viewed`  
RIGHT JOIN tbl_photos ON tbl_viewed.photo_id = tbl_photos.photo_id
WHERE tbl_photos.status =1
AND `timeviewed` >1225353785
GROUP BY `photo_id`  
ORDER BY `total_watch_count` DESC  
LIMIT 0 , 10
 

 
Добавлено:
Вот что получилось в результате:
http://rapidshare.com/files/299919986/Most_popular_Pictures.htm.html
Что скажете?

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 11:52 30-10-2009 | Исправлено: israel_rider, 12:03 30-10-2009
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Что скажете?

ничего хорошего) Using filesort это худший вариант
 
неплоха бы замерить время выполнения первого и второго запроса

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 12:23 30-10-2009 | Исправлено: andead, 12:25 30-10-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6

Компьютерный форум Ru.Board » Интернет » Web-программирование » Оптимизация запроса MySQL


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru