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

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

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

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

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

APTEM



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

Цитата:
Работает медленно (до 0.5 сек)  
Предложения по оптимизации?
в первичном индексе datefill поставь сразу после country

Всего записей: 396 | Зарегистр. 16-07-2004 | Отправлено: 19:31 17-12-2009
UncoNNecteD



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
APTEM
Гениально. Дайте покурить маны на тему!
 
EXPLAIN изменился так:
1    SIMPLE    tablestat    ref    PRIMARY    PRIMARY    2    const    53016    Using where; Using index
1    SIMPLE    tablestat    ref    PRIMARY    PRIMARY    2    const    49437    Using where; Using index; Using filesort
 
Ожидать теперь проблем с другими запросами к этой таблице?
Почему не использовался индекс reg_df ?
 
Время запроса уменьшилось до 0.0005 сек!!
Спасибо!


----------
-= Я тут чертовски давно =-

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 21:16 17-12-2009
APTEM



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
индексы строятся исходя из используемых запросов. если первичный ключ построен на col1, col2, col3 (именно в таком порядке), то сервер БД может использовать фрагменты col1+col2+col3, или col1+col2, или col1 для оптимизации поиска в таблице. если нужен поиск по col1+col3, следует дополнительно создать индекс по этим двум полям. разрывы в перечне полей недопустимы - сервер в этом случае откинет те поля индекса, которые попадают в разрыв и идут после него.
 
в твоём случае ключ построен по country+city+typeid+datefill, а в запросе используются поля `country`+`datefill` (именно в этом порядке, ибо сначала происходит ограничивание индекса диапазоном, а потом сортировка в диапазоне)
 
в результате сервер использовал единственный подходящий (пусть и не 100%) индекс - первичный. перестановка полей первичного индекса позволила серверу использовать ключ в данном запросе на 100%. индекс reg_df построен по полям в неподходящем порядке, поэтому был откинут сервером, как неудачный для данного запроса.

Всего записей: 396 | Зарегистр. 16-07-2004 | Отправлено: 23:43 17-12-2009
UncoNNecteD



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
APTEM
Спасибо еще раз, пшел дальше искать тяжкие запросы.
 
А что есть filesort в explain?

----------
-= Я тут чертовски давно =-

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 00:54 18-12-2009
rtyug



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хотел вывести одим запросом ближайщие подкатегории, так сделано тут например: http://yaca.yandex.ru/yca/cat/Entertainment/
 
категори: Игры
подкатегории:     3D-шутеры, RPG, стратегии, Флеш-игры ...  
 
работает
 

Код:
SELECT t3.id_se, t3.name_se, t3.parent_se_id
        FROM section AS t3
        WHERE t3.parent_se_id = 1
         
         
        UNION ALL
   
        SELECT t1.id_se, t1.name_se, t1.parent_se_id
            FROM  section AS t1  
            WHERE
          t1.parent_se_id = t3.id_se

 
НО хочу сделать чтобы был LIMIT 3 в подкатегориях, в данном случае не получается это сделать...
 
 
 
есть задачка http://habrahabr.ru/blogs/mysql/44807/
 

Цитата:
 
Есть новостной блоггерный сайт. Есть такие сущности как новости и комментарии к ним.
 
Задача — нужно написать запрос, который выводит список из 10 новостей определенного типа (задается пользователем) отсортированные по времени издания в хронологическом порядке, а также к каждой из этих новостей показать не более 10 последних коментариев, т.е. если коментариев больше — показываем только последние 10.
 

 
решение
 

Код:
 
CREATE TABLE `news` (
`id` int(11) NOT NULL auto_increment,
`date` datetime NOT NULL,
`title` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `date` (`date`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
CREATE TABLE `comment` (
`id` int(11) NOT NULL auto_increment,
`news_id` int(11) NOT NULL,
`date` datetime NOT NULL,
`body` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `news` (`news_id`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 

 

Код:
 
SELECT n. *, c. *
FROM (
SELECT *
FROM news
WHERE
type = 2
ORDER BY date DESC
LIMIT 10
) as n
INNER JOIN (
SELECT *
FROM comments
WHERE
comments.news_id IN (
SELECT news.id
FROM news
WHERE
type = 2
ORDER BY date DESC
)
ORDER BY date DESC
LIMIT 10
) AS c
ON c.news_id = n.id  
 

 
 
как сюда прикрутить мой вариант
 
вот я пробовал - не хочет....
 

Код:
 
SELECT n. *, c. *
FROM (
SELECT *
FROM section as t1
 
 
LIMIT 10
) as n
INNER JOIN (
SELECT *
FROM section as t2
WHERE
t2.id_se IN (
SELECT t3.id_se
FROM section as t3
 
 
)
 
LIMIT 10
) AS c
ON c.id_se = n.parent_se_id  
 

 
 
PS Cheery, мне показалось что это создание запроса, а не оптимизация... так как запроса сейчас нету рабочего, есть только левый

Всего записей: 490 | Зарегистр. 13-05-2009 | Отправлено: 00:59 18-12-2009
DarkSmoke



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

Код:
CREATE TABLE `Users` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `login` tinytext NOT NULL,
  `password` tinytext NOT NULL,
  `status` enum('0','1') NOT NULL,
  `date` date NOT NULL,
  `activate` tinytext NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
 

какой запрос будет работать быстрее и почему, объясните плз.  

Код:
SELECT * FROM `Users` WHERE `login`='"$login"' LIMIT 1

или  

Код:
SELECT `login` FROM `Users` WHERE `login`='"$login"' LIMIT 1

Нужно что бы не было повторяющихся логинов.
Как можно самому узнать какой запрос быстрее?
 
Или может есть какие-то другие способы?

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 13:50 18-12-2009 | Исправлено: DarkSmoke, 14:26 18-12-2009
andead



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

Цитата:
какой запрос будет работать быстрее и почему

если у вас не терабайт данных, то оба запроса отработают одинаково
 

Цитата:
Как можно самому узнать какой запрос быстрее?

запоминаете время до выполнения и после, вычитаете

----------
мой блог

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 17:00 18-12-2009
DarkSmoke



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

Цитата:
запоминаете время до выполнения и после, вычитаете

так это меньше секунды, мне что с секундомером сидеть? Другие способы есть?
 

Цитата:
если у вас не терабайт данных, то оба запроса отработают одинаково

Ну пускай будут пару тысяч логинов или даже 10000

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 17:41 18-12-2009
israel_rider

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

Всего записей: 926 | Зарегистр. 28-07-2007 | Отправлено: 18:34 18-12-2009 | Исправлено: israel_rider, 18:41 18-12-2009
andead



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

Цитата:
так это меньше секунды, мне что с секундомером сидеть?

надеюсь это шутка если нет то вам сюда
 

Цитата:
Другие способы есть?

phpMyAdmin

----------
мой блог

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



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

Цитата:
phpMyAdmin

а как через него смотреть?
 
Все разобрался. Спасибо!

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 11:04 19-12-2009 | Исправлено: DarkSmoke, 11:04 19-12-2009
DarkSmoke



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

Код:
INSERT INTO `Users` SET `activate`='1' WHERE `login`=(SELECT `login` FROM `Users` WHERE `login`='dеее@ukr.net' LIMIT 1) LIMIT 1

 

Цитата:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `login`=(SELECT `login` FROM `Users` WHERE `login`='deee@ukr.net' LIMIT ' at line 1  
 

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 16:07 19-12-2009
derelict



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DarkSmoke
Зачем ты выбираешь логин по значению логина? И скорее всего надо не INSERT, а UPDATE использовать:

Код:
 
UPDATE `Users` SET `activate`='1' WHERE `login`='dеее@ukr.net'
 

Всего записей: 232 | Зарегистр. 11-06-2006 | Отправлено: 16:16 19-12-2009
substrackto

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DarkSmoke
1 вы выбираете и вставляете в одну и ту самую таблицу - одного и того самого юзера (может вам апдейт нужно сделать?)
2 в команде инсерт нету лимита

Всего записей: 93 | Зарегистр. 25-10-2007 | Отправлено: 16:24 19-12-2009
DarkSmoke



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Все решил, для ИНСЕРТА ВХЕРЕ нет

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 16:25 19-12-2009 | Исправлено: DarkSmoke, 17:01 19-12-2009
UncoNNecteD



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

----------
-= Я тут чертовски давно =-

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 23:26 20-12-2009
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Возникла следующая нелепая проблема. Вызвал шеф, и произнёс такую фразу:  
"Такой то сайт зависает, из за неправильных запросов к БД. Необходимо решить проблему. Для этого используй LOAD" .
И теперь я ломаю голову, что он имел в виду!  
Выполнить профилирование, выявить запрос, вызывающий зависание - это всё понятно и очевидно.  
Но что он имел в виду, употребив слово "LOAD"? И какое это имеет отношение к профилированию??? Я страшно боюсь сесть в лужу, если потом вдруг воясниться, что действительно существует какой то метод профилирования или деббагинга, связанный со словом "LOAD", а я о нём ничего не знал.
Помогите, плиз! Что там может быть связано со словом "LOAD"?
 
Добавлено:
А может, это просто существует какой то профайлер, который запускается командой "LOAD"?

Всего записей: 926 | Зарегистр. 28-07-2007 | Отправлено: 20:58 15-01-2010
andead



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

----------
мой блог

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 21:44 15-01-2010
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Правильно ли я Вас понял, что термин "LOAD" относится непонятно к чему, и к профилированию БД, во всяком случае, отношения не имеет точно?

Всего записей: 926 | Зарегистр. 28-07-2007 | Отправлено: 21:51 15-01-2010
APTEM



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
может, шеф имел в виду OLAP?

Всего записей: 396 | Зарегистр. 16-07-2004 | Отправлено: 23:13 15-01-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 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-2025

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru