Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очень долгие запросы mysql, Запрос обрабатывается по 10 секунд 
:(
    Опции темы
Temp
Дата 26.4.2011, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 577
Регистрация: 12.1.2003

Репутация: нет
Всего: -3



Имеет сайт http://mp3disc.info в котором база выполнена на mysql в котором таблица с данными имеет 115000 записей.
запрос к базе 
Код

SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3 ORDER BY `id` DESC

занял 7.3969 сек

а такой запрос
Код

SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3

занял 0.2789 сек

Из за того что стоит сортировка запросы обрабатываются в 35 раз медленнее.
Как выполнять такие запросы быстро?


--------------------
<удалено администрацией>
PM MAIL ICQ   Вверх
Temp
Дата 26.4.2011, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 577
Регистрация: 12.1.2003

Репутация: нет
Всего: -3



ещё обнаружил интересную вещь!

Код

SELECT * 
FROM `fde_articles` 
LIMIT 0 , 30

Отображает строки 0 - 29 (115,819 всего, запрос занял 0.0016 сек.)

Код

SELECT * 
FROM `fde_articles` 
LIMIT 115800 , 30

Отображает строки 115800 - 115818 (115,819 всего, запрос занял 16.4113 сек.)


последняя страница в 10000 раз медленнее открывается !!!


--------------------
<удалено администрацией>
PM MAIL ICQ   Вверх
ksnk
Дата 26.4.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Код

select * from (SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3 ) as x ORDER BY x.`id` DESC

а такое как долго будет выполняться?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Temp
Дата 26.4.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 577
Регистрация: 12.1.2003

Репутация: нет
Всего: -3



ksnk, 
Отображает строки 0 - 29 (305 всего, запрос занял 16.6282 сек.)



--------------------
<удалено администрацией>
PM MAIL ICQ   Вверх
ksnk
Дата 26.4.2011, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Может, пора сделать оптимизирование таблице? Id - primary key?

Можно покрутить такую комбинацию
Код

create temporary table `temp` ( 
определения полей как в основной таблице
)
SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3;

и сразу второй
Код

select * from `temp` order by `id' DESC;

так может получится быстрее. Хотя все равно как-то непонятно...

Это сообщение отредактировал(а) ksnk - 26.4.2011, 23:09


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Muerto
Дата 27.4.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: нет
Всего: 4



Любопытно... судя по времени на status индекс уже есть...
Поставить как писали выше на id primary key

Если он уже стоит, то чудеса  smile 


--------------------
user posted image
PM MAIL   Вверх
Temp
Дата 27.4.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 577
Регистрация: 12.1.2003

Репутация: нет
Всего: -3



ksnk, я не совсем понял что за первый запрос!
структура таблицы
Код

CREATE TABLE IF NOT EXISTS `fde_articles` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `address` varchar(255) NOT NULL default '',
  `feed_base` varchar(255) NOT NULL default '',
  `short_text` text NOT NULL,
  `full_text` text NOT NULL,
  `name` text NOT NULL,
  `title` text NOT NULL,
  `feed_id` int(10) NOT NULL default '0',
  `feed_category_id` int(10) NOT NULL default '0',
  `category` text NOT NULL,
  `status` tinyint(1) NOT NULL default '0',
  `md5` varchar(32) NOT NULL default '',
  `images` text NOT NULL,
  `date` datetime NOT NULL default '0000-00-00 00:00:00',
  `show_main` enum('yes','no') NOT NULL default 'no',
  `category_id` text NOT NULL,
  `short_news_length` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `status` (`status`),
  KEY `address` (`address`),
  KEY `feed_id` (`feed_id`),
  KEY `md5` (`md5`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=115823 ;


Это сообщение отредактировал(а) Temp - 27.4.2011, 11:28


--------------------
<удалено администрацией>
PM MAIL ICQ   Вверх
ksnk
Дата 27.4.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Temp @  27.4.2011,  11:27 Найти цитируемый пост)
я не совсем понял что за первый запрос!


Код

mysql_query('drop table if exists `temp`;');

mysql_query("create temporary table `temp` ( 
  `id` int(10) unsigned NOT NULL auto_increment,
  `address` varchar(255) NOT NULL default '',
  `feed_base` varchar(255) NOT NULL default '',
  `short_text` text NOT NULL,
  `full_text` text NOT NULL,
  `name` text NOT NULL,
  `title` text NOT NULL,
  `feed_id` int(10) NOT NULL default '0',
  `feed_category_id` int(10) NOT NULL default '0',
  `category` text NOT NULL,
  `status` tinyint(1) NOT NULL default '0',
  `md5` varchar(32) NOT NULL default '',
  `images` text NOT NULL,
  `date` datetime NOT NULL default '0000-00-00 00:00:00',
  `show_main` enum('yes','no') NOT NULL default 'no',
  `category_id` text NOT NULL,
  `short_news_length` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `status` (`status`),
  KEY `address` (`address`),
  KEY `feed_id` (`feed_id`),
  KEY `md5` (`md5`)
)
SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3;");

$result=mysql_query("select * from `temp` order by `id' DESC;");

Понятно, что проверки бы не помешали, но для чернового тестирования идеи может и так сойти...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Temp
Дата 27.4.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 577
Регистрация: 12.1.2003

Репутация: нет
Всего: -3



Может быть эа проблема из-за того что база более 100 000 строк содержит?!


--------------------
<удалено администрацией>
PM MAIL ICQ   Вверх
ksnk
Дата 27.4.2011, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



То, что предлагаю я - просто выборка из базы (утверждается, что она быстрая) ~300 записей и вставка их во временную таблицу. Таблица с ключом temporary создается, предпочтительно, в памяти и должна по идее работать быстро. Так как записей там тоже немного - селект с сортировкой будет также достаточно быстр.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 27.4.2011, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



Код

SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3

Цитата(Temp @  26.4.2011,  18:09 Найти цитируемый пост)
занял 0.2789 сек

А 
Код

SELECT SQL_NO_CACHE *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3

сколько займет? (а еще лучше через BENCHMARK)


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Temp
Дата 27.4.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 577
Регистрация: 12.1.2003

Репутация: нет
Всего: -3



сегодня дела ещё хуже
Код

SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3

Отображает строки 0 - 29 (305 всего, запрос занял 1.0859 сек.)

Код

SELECT SQL_NO_CACHE *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3

Отображает строки 0 - 29 (305 всего, запрос занял 2.4026 сек.)


ksnk, не работает код, ошибку пишет "#1054 - Unknown column 'id' DESC' in 'order clause'"


--------------------
<удалено администрацией>
PM MAIL ICQ   Вверх
Muerto
Дата 27.4.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: нет
Всего: 4



А после: 
SELECT *  FROM `fde_articles` WHERE `title` LIKE '%Beatles%' and `status` = 3

идентификаторы выдает по возрастанию?

Можно взять и средствами Php сделать reverse , оч быстро будет работать http://php.net/manual/en/function.array-reverse.php


--------------------
user posted image
PM MAIL   Вверх
ksnk
Дата 28.4.2011, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Temp @  27.4.2011,  21:24 Найти цитируемый пост)
ksnk, не работает код, ошибку пишет "#1054 - Unknown column 'id' DESC' in 'order clause'" 

последняя строчка
Код

$result=mysql_query("select * from `temp` order by `id` DESC;");

кавычка у id была другая


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
solenko
Дата 28.4.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



Блин, да дайте же explain запроса. Думаю, при добавлении order_by там появится самая медленная операция -- filesort

По поводу limit это давняя проблема -- http://www.mysqlperformanceblog.com/2008/0...nated-displays/


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.