Задавайте вопросы, мы ответим
Вы не зашли.
Помогите понять следующую ситуацию
Есть таблица с 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)
Неактивен
За чем это все ? :-)
Почему вынимать по одному ?, а не по 1000 например ?
Или данные переливать одним одним SQL ? Или с помощью итераций в stored procedure ?
Неактивен
>Почему вынимать по одному ?, а не по 1000 например ?
вы имеете в виду IN (id1, id2, id3) ? Думаю, ситуация тут будет та же самая - сначала будет затрачиваться одно время, потом другое
если вы имеете в виду использование лимитов(LIMIT 2000, 1000), то это будет невозможно долго
>Или данные переливать одним одним SQL ?
100 гигабайт одним запросом не получится вынуть
>Или с помощью итераций в stored procedure ?
С этим не разбирался.
Затем что мне нужно обработать текст (пропарсить его с помощью php).
Неактивен
jerry написал:
в итоге имеем ситуацию, что при первом проходе 80к строк перебрались бы за 4 минуты. а при втором проходе эти же строки перебрались бы меньше чем за минуту.
Как это объяснить?
Кэширование
http://webew.ru/articles/1041.webew
Неактивен
jerry написал:
>Почему вынимать по одному ?, а не по 1000 например ?
вы имеете в виду IN (id1, id2, id3) ? Думаю, ситуация тут будет та же самая - сначала будет затрачиваться одно время, потом другое
если вы имеете в виду использование лимитов(LIMIT 2000, 1000), то это будет невозможно долго
where id between 1000 and 2000
индекс на id есть?
Неактивен
1) Если список id последовательный то как вася писал
Неактивен
>where id between 1000 and 2000
айдишник char-овский
>индекс на id есть?
да
>Кэширование
>http://webew.ru/articles/1041.webew
кэширования нету
Неактивен
Кеширование в MySQL есть всегда, независимо от настроек, потому у Вас повторные запросы отрабатывались быстрее, чем в первый раз. Параметры кеширования в конфиге - это уже дополнительные плюшки.
Неактивен
>2) Что именно парсить нужно ? И что потом с данными делать ? Выложите ваш пример, возможно есть более легкий путь.
ну там идёт разбор текста..
тут дело даже не в том, чтобы найти какой-то другой более быстрый способ. мне просто интересно почему так происходит - что на это может влиять
Неактивен
>Кеширование в MySQL есть всегда, независимо от настроек, потому у Вас повторные запросы отрабатывались быстрее, чем в первый раз. Параметры кеширования в конфиге - это уже дополнительные плюшки.
вот оно как
Неактивен
jerry написал:
кэширования нету
может быть отключено кэширование запросов, но кэш индексов остался (если конечно параметры типа key_buffer_size не выставленны в ноль)
http://sqlinfo.ru/articles/info/3.html
Неактивен
Всё таки решил вернуться к этому вопросу
Рассмотрим на более простом примере: берём любую таблицу со 100 тысячами записей, делаем простую выборку вида WHERE row1='...'. Всегда получается, что первый запрос выполняется в разы дольше, чем последующие(причём неважно есть на row1 индекс или нет).
key_buffer_size пробовал ставить в ноль (ну там 8 выставлялось) - эффекта это не оказывало
при перезапуске mysql этот "кэш" не теряется - может это несовсем mysql кэширует, а что-то более низкого уровня, дисковая система, например? смотрел на нескольких серверах.
В общем интересно что это за "кэширование" и что на него влияет - например, сколько времени оно храниться, каков размер этого кэша.
Отредактированно jerry (01.11.2013 00:21:06)
Неактивен
jerry написал:
Всё таки решил вернуться к этому вопросу
Рассмотрим на более простом примере: берём любую таблицу со 100 тысячами записей, делаем простую выборку вида WHERE row1='...'. Всегда получается, что первый запрос выполняется в разы дольше, чем последующие(причём неважно есть на row1 индекс или нет).
Попробуйте повторить несколько раз запрос вида
SELECT SQL_NO_CACHE * FROM my_table WHERE row1='...'
Должен выполняться с одной и той же скоростью.
jerry написал:
В общем интересно что это за "кэширование" и что на него влияет - например, сколько времени оно храниться, каков размер этого кэша.
Таки почитайте тыц.
Неактивен