SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.06.2013 19:16:07

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Скорость перебора строк

Помогите понять следующую ситуацию
Есть таблица с 10 млн строк весом примерно в 100 гигабайт вида ID-Text (2 столбца)
Я скидываю в пхп-шный массив все 10 млн айдишников и начинаю делать запросы на выемку каждой строки
foreach ($ids as $id) {
  $res = mysql_query("SELECT * FROM table WHERE id = " . $id);
  $result = mysql_fetch_assoc($res);
}
В итоге за первую минуту перебирается 20к строк. Затем останавливаю процесс. Начинаю заново
Первые 20к строк перебираются уже за 10 секунд. Затем ещё 20к перебираются ещё 1 минуту. Останавливаю процесс, начинаю его заново
Первые 40к строк перебираются уже за 20 секунд. Затем ещё 20к перебираются ещё 1 минуту. Останавливаю процесс, начинаю его заново
Первые 60к строк перебираются уже за 30 секунд. Затем ещё 20к перебираются ещё 1 минуту. Останавливаю процесс
в итоге имеем ситуацию, что при первом проходе 80к строк перебрались бы за 4 минуты. а при втором проходе эти же строки перебрались бы меньше чем за минуту.
Как это объяснить?

Отредактированно jerry (05.06.2013 19:19:45)

Неактивен

 

#2 05.06.2013 22:46:42

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Скорость перебора строк

За чем это все ? :-)
Почему вынимать по одному ?, а не по 1000 например ?
Или данные переливать одним одним SQL ? Или с помощью итераций в stored procedure  ?

Неактивен

 

#3 05.06.2013 23:33:00

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Re: Скорость перебора строк

>Почему вынимать по одному ?, а не по 1000 например ?
вы имеете в виду IN (id1, id2, id3) ? Думаю, ситуация тут будет та же самая - сначала будет затрачиваться одно время, потом другое
если вы имеете в виду использование лимитов(LIMIT 2000, 1000), то это будет невозможно долго

>Или данные переливать одним одним SQL ?
100 гигабайт одним запросом не получится вынуть

>Или с помощью итераций в stored procedure  ?
С этим не разбирался.


Затем что мне нужно обработать текст (пропарсить его с помощью php).

Неактивен

 

#4 06.06.2013 08:15:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Скорость перебора строк

jerry написал:

в итоге имеем ситуацию, что при первом проходе 80к строк перебрались бы за 4 минуты. а при втором проходе эти же строки перебрались бы меньше чем за минуту.
Как это объяснить?

Кэширование
http://webew.ru/articles/1041.webew

Неактивен

 

#5 06.06.2013 08:19:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Скорость перебора строк

jerry написал:

>Почему вынимать по одному ?, а не по 1000 например ?
вы имеете в виду IN (id1, id2, id3) ? Думаю, ситуация тут будет та же самая - сначала будет затрачиваться одно время, потом другое
если вы имеете в виду использование лимитов(LIMIT 2000, 1000), то это будет невозможно долго

where id between 1000 and 2000
индекс на id есть?

Неактивен

 

#6 06.06.2013 11:02:34

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Скорость перебора строк

1) Если список id последовательный то как вася писал

where id between 1000 and 2000
если нет то
where id IN (id1, id2, id3)
порциями по 1000. Можно запускать процессы параллельно на разные диапазоны id. Разницу увидите значительную.
2) Что именно парсить нужно ? И что потом с данными делать ? Выложите ваш пример, возможно есть более легкий путь.

Неактивен

 

#7 06.06.2013 11:52:12

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Re: Скорость перебора строк

>where id between 1000 and 2000
айдишник char-овский

>индекс на id есть?
да

>Кэширование
>http://webew.ru/articles/1041.webew
кэширования нету

Неактивен

 

#8 06.06.2013 11:55:18

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Скорость перебора строк

Кеширование в MySQL есть всегда, независимо от настроек, потому у Вас повторные запросы отрабатывались быстрее, чем в первый раз. Параметры кеширования в конфиге - это уже дополнительные плюшки.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#9 06.06.2013 12:07:20

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Re: Скорость перебора строк

>2) Что именно парсить нужно ? И что потом с данными делать ? Выложите ваш пример, возможно есть более легкий путь.
ну там идёт разбор текста..
тут дело даже не в том, чтобы найти какой-то другой более быстрый способ. мне просто интересно почему так происходит - что на это может влиять

Неактивен

 

#10 06.06.2013 12:08:16

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Re: Скорость перебора строк

>Кеширование в MySQL есть всегда, независимо от настроек, потому у Вас повторные запросы отрабатывались быстрее, чем в первый раз. Параметры кеширования в конфиге - это уже дополнительные плюшки.
вот оно как

Неактивен

 

#11 06.06.2013 12:59:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Скорость перебора строк

jerry написал:

кэширования нету

может быть отключено кэширование запросов, но кэш индексов остался (если конечно параметры типа key_buffer_size не выставленны в ноль)
http://sqlinfo.ru/articles/info/3.html

Неактивен

 

#12 01.11.2013 00:17:17

jerry
Участник
Зарегистрирован: 31.01.2011
Сообщений: 18

Re: Скорость перебора строк

Всё таки решил вернуться к этому вопросу smile
Рассмотрим на более простом примере: берём любую таблицу со 100 тысячами записей, делаем простую выборку вида WHERE row1='...'. Всегда получается, что первый запрос выполняется в разы дольше, чем последующие(причём неважно есть на row1 индекс или нет).

key_buffer_size пробовал ставить в ноль (ну там 8 выставлялось) - эффекта это не оказывало
при перезапуске mysql этот "кэш" не теряется - может это несовсем mysql кэширует, а что-то более низкого уровня, дисковая система, например? смотрел на нескольких серверах.

В общем интересно что это за "кэширование" и что на него влияет - например, сколько времени оно храниться, каков размер этого кэша.

Отредактированно jerry (01.11.2013 00:21:06)

Неактивен

 

#13 01.11.2013 01:44:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Скорость перебора строк

jerry написал:

Всё таки решил вернуться к этому вопросу smile
Рассмотрим на более простом примере: берём любую таблицу со 100 тысячами записей, делаем простую выборку вида WHERE row1='...'. Всегда получается, что первый запрос выполняется в разы дольше, чем последующие(причём неважно есть на row1 индекс или нет).

Попробуйте повторить несколько раз запрос вида
SELECT SQL_NO_CACHE * FROM my_table WHERE row1='...'
Должен выполняться с одной и той же скоростью.

jerry написал:

В общем интересно что это за "кэширование" и что на него влияет - например, сколько времени оно храниться, каков размер этого кэша.

Таки почитайте тыц.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson