Оптимизация запросов

WebByte

Проходящий мимо
Оптимизация запросов

Имеется проект, на котором вертятся куча демонов, работающих с БД. Соответственно, возникает вопрос в оптимизации запросов.

К примеру такая таблица MyISAM:

PHP:
CREATE TABLE `nkm_site` (
  `url` varchar(100) NOT NULL default '',
  `status` tinyint(1) NOT NULL default '0',
  `id` int(6) NOT NULL auto_increment,
  PRIMARY KEY  (`id`),
  KEY `st` (`status`)
);
То есть, URL страницы, флаг выполненности какого-либо действия, ID.

В таблице ~100К записей. С дефолтным status'ом ~95%

Один из демонов забивает в эту таблицу данные, другой выполняет некие действия над url с дефолтным статусом и статус меняет. Вытаскивает данные простым запросом

PHP:
SELECT url, id FROM nkm_site WHERE status=0 LIMIT 1
Explain дает тип связывания ref.

Делаю тестовый скрипт, прогоняю по нему апач-бенчмарком и тихо офигеваю - всего ~2 запроса в секунду.

Вопрос. Можно ли как-то этот запрос оптимизировать?
 

WebByte

Проходящий мимо
А что индексы? В таблице есть (см. запрос на создание).
 

AnToXa

prodigy-одаренный ребенок
почему вы решили, что это mysql тормозит?
 

Кром

Новичок
WebByte
Если у тебя 95% с дефолтным значением, то индекс на status тут и не нужет. mysql все равно просмотрит всю таблицу.
Попробуй убрать индекс и потестируй снова.

>прогоняю по нему апач-бенчмарком и тихо офигеваю - всего ~2 запроса в секунду.

Ты уверен, что правильно сделал тест? Возможно тормозит не запрос а сам скрипт.
 

AnToXa

prodigy-одаренный ребенок
Кром
у него limit 1 стоит, какой просмотр таблицы - берет первое значение из индекса и всех дел.
хотя надо explain посмотреть конечно
 

WebByte

Проходящий мимо
почему вы решили, что это mysql тормозит?
Ты уверен, что правильно сделал тест? Возможно тормозит не запрос а сам скрипт.
А тест простой:
PHP:
<?
mysql_connect("localhost", "user", "pwd");
mysql_select_db("mdb");
mysql_query("описанный выше запрос");
?>

Индекс с этого поля удалить нельзя - он потом для используется другими запросами.

Explain:
http://photo.webbyte.info/00.gif
 

Кром

Новичок
Сделай в этом скрипте цикл, и прогони по нему десяток раз.

for ()
{
mysql_query("описанный выше запрос");
}

Замерь время в начала и в конце цикла. Скажи что получается.
 

AnToXa

prodigy-одаренный ребенок
нда, судя по explain mysql умудряется всю таблицу просканить, zhopa.
 

Кром

Новичок
>Получается около секунды.

Потестируй несколько раз и приведи точные цифры - сколько циклов, какое время, сколько раз тестировал.
 

WebByte

Проходящий мимо
В общем, дело оказалось в ab
Он вообще для любого файла php не захотел выдавать больше 2 реквестов в минуту.

Плюс, попинал админа и тот немного подкрутил настройки.
Шустрее залетало. Всем спасибо.
 
Сверху