|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
Всех приветствую! Итак, начну сначала. Возникла необходимость в обработке большого количества информации... каждый месяц в базу будет добавляться (в одну таблицу или в разные?) примерно 16 000 000 записей. Таблица состоит из 3 полей: дата, MAC-адрес, IP-адрес. CREATE TABLE `stat` ( `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `mac` varchar(18) NOT NULL default '', `ip` varchar(255) NOT NULL default '', KEY `mac` (`mac`), KEY `login` (`ip`) ) ENGINE=MyISAM; Ни одно из полей не является уникальным, т. к. уникальных связок "дата - MAC-адрес - IP-адрес" нет. Каждый IP может быть в любое время под любым MAC-адресом. Надеюсь, я понятно объяснил?! В данный момент в таблице находится 32 000 000 записей. mysql> select ip from stat group by ip order by ip limit 1, 10; ... 10 rows in set (51.47 sec) mysql> select count(ip) from stat group by ip order by ip; ... 320 rows in set (22 min 26.78 sec) Время выборки меня конечно же не устраивает :( А теперь, внимание, впорос! Как ускорить выполнение запроса? Подскажите, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 10:29 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
очередной биллинг? А нужно ли хранить эти данные в "сыром виде" более месяца-двух? И есть ли смысл выполнять приведенные запросы на данных за период в который попадет более одного календарного месяца? И нельзя ли привести более "практические" запросы, чем те, которые приведены? кому нужны 10 наименьших ip-адерсов? я бы по прошедшим календарным месяцам хранил результаты приведенных запросов в отдельной табличке и либо сразу брал данные оттуда, либо, при необходимости, объединял бы результаты с результаттами, полученными из "сырых" данных. кстати, время само по себе мало о чем говорит... сколько времени занимат повторное выполнение этих же запросов? какие настроены буфера, выделение памяти и т.п.? какое железо, диски, рейды и т.п.? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 10:51 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
кстати, данные будут добавлятся скопом за какой-то период или равномерно, по мере поступления? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 10:52 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
Это не биллинг, но делается для провайдера. Так можно вычислить с каких компьютеров (MAC) выходят в сеть под несколькими логинами (IP). Запрос, который я выполнил, не будет иметь практического применения. Я решил что он будет потяжелее, чем SELECT count(*) FROM stat; и можно будет видеть какая нагрузка будет при таком объёме данных. Фактически мне нужен список уникальных IP и список MAC, соответствующих каждому из этих IP. Также, наоборот: список уникальных MAC и список IP, соответствующие каждому из этих MAC. Данные можно разбить по месяцам, например, но, как я уже сказал выше, их будет не менее 15 000 000 за каждый месяц. Данные буду поступать скопом раз в неделю, например. Получается что сразу будут добавляться примерно по 3 000 000 новых данных. Время на повтор первого запроса: 31.17 sec. Второй запрос всё ещё выполняется :) OS: FreeBSD CPU: Intel(R) Celeron(R) CPU 2.53GHz RAM: 256 Мб. HDD: SCSI, 40 Gb. MySQL 4.1.19. Вот выборка по памяти: mysqladmin variables | grep mem | innodb_additional_mem_pool_size | 1048576 | | innodb_buffer_pool_awe_mem_mb | 0 | | locked_in_memory | OFF | mysqladmin variables | grep buf | bdb_log_buffer_size | 32768 | | bulk_insert_buffer_size | 8388608 | | innodb_buffer_pool_awe_mem_mb | 0 | | innodb_buffer_pool_size | 8388608 | | innodb_log_buffer_size | 1048576 | | join_buffer_size | 131072 | | key_buffer_size | 8388600 | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | preload_buffer_size | 32768 | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | sort_buffer_size | 2097144 | Может быть нужно что-то ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 11:28 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
30region.comФактически мне нужен список уникальных IP и список MAC, соответствующих каждому из этих IP. Также, наоборот: список уникальных MAC и список IP, соответствующие каждому из этих MAC.это можно сделать одним запросом: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 11:44 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
Наверное так и прийдется поступить... буду сначала обрабатывать входную информацию, а в таблицы записывать результат... чтобы не было дубликата. Спасибо за помощь. Ну и вопрос в тему. Какое количество данных в MySQL уже может считать критическим для быстрой обработки? 16 млн. записей обрабатываются, как мы видим, даются уже с трудом. Ясное дело что всё зависит от железа, от типа информации и т. д., но всё же. Например, моя таблица описана выше. Какое количество запией для ьаблицы уже критично? Мне необходимо чтобы запросы выполнялись не более нескольких минут (уж никак не 20 минут!) :) Есть мысли? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 12:25 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
На "тяжесть" выполнения запросов кроме количества записей, еще влияют индексы и, главное, сами запросы! Сколько записей затрагивают эти запросы, сколько выдают, каков план выполнения - все это играет свою роль. Вполне возможны запросы которые на миллиарде записей будут отрабатывать за доли секунды, а возможно и на тысяче получить дикие тормоза. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 13:09 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
30region.com Вот выборка по памяти: mysqladmin variables | grep buf | bdb_log_buffer_size | 32768 | | bulk_insert_buffer_size | 8388608 | | innodb_buffer_pool_awe_mem_mb | 0 | | innodb_buffer_pool_size | 8388608 | | innodb_log_buffer_size | 1048576 | | join_buffer_size | 131072 | | key_buffer_size | 8388600 | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | preload_buffer_size | 32768 | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | sort_buffer_size | 2097144 | Может быть нужно что-то ещё? Да, нужно. Похоже ваш mysql просто страдает от недостатка места в буферах. key_buffer_size = 8 мегабайт при миллионах записей - это очень очень мало. Давайте для проверки посмотрим Ваш show status В частности соотношение key_reads и key_read_requests. Нормальное рабочее key_reads/key_reads_requests должно быть порядка 0.01 Если оно больше (как я сильно подозреваю) - надо увеличивать key_buffer_size. Скажем, до трети всей RAM ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 16:22 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
30region.comКакое количество данных в MySQL уже может считать критическим для быстрой обработки? 16 млн. записей обрабатываются, как мы видим, даются уже с трудом. странно что он вообще еще работает с такой таблицей! :-> ну скажите на милось - зачем вам под ip поле varchar(255)??? ip адрес прекрасно можно хранить в int! есть в mysql ф-ции для перевода - INET_ATON(), INET_NTOA() тоже самое с mac-адресом, сконвертируйте все в числовые поля - ваш текущий сервер прекрасно потянет в 10 раз больше -- Dmitry ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2006, 21:17 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
ХренДа, нужно. Похоже ваш mysql просто страдает от недостатка места в буферах. key_buffer_size = 8 мегабайт при миллионах записей - это очень очень мало. Давайте для проверки посмотрим Ваш show status В частности соотношение key_reads и key_read_requests. Нормальное рабочее key_reads/key_reads_requests должно быть порядка 0.01 Если оно больше (как я сильно подозреваю) - надо увеличивать key_buffer_size. Скажем, до трети всей RAM Прошу прощения за оффтоп и thread hijacking, но не подскажете ли других "диагностических" показателей такого рода, а еще лучше - линки, где почитать на эту тему? Есть достаточно нагруженный MySQL-сервер в полностью дефолтной конфигурации - хочется понять, можно ли его "заточить" под конкретные задачи, не анализируя каждый запрос в отдельности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2006, 20:19 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
braindancerне подскажете ли других "диагностических" показателей такого рода, а еще лучше - линки, где почитать на эту тему? В документации , в частности Server System Variables и Server Status Variables ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2006, 20:31 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
Кстати, в поставке MySQL идёт несколько примеров конфигурационных файлов, рассчитаных на различный уровень нагрузки и используемого железа. Под FreeBSD их можно найти в /usr/local/share/mysql/, для других *nix систем я столь точного указания пути привести не могу, но обычно это какой-нибудь /usr/share/mysql или что-то вроде. Насчёт винды -- увы, не в курсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2006, 03:59 |
|
Обработка большого объема данных в MySQL.
|
|||
---|---|---|---|
#18+
DocAlНасчёт винды -- увы, не в курсе.На винде "треннировочные" конфы лежат в каталоге самой СУБД. их там штук 5. путь - что-то типа "C:\Program Files\MySQL\MySQL Server 5.0\my-innodb-heavy-4G.ini" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2006, 11:55 |
|
|
start [/forum/topic.php?fid=47&msg=33741470&tid=1828642]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 166ms |
0 / 0 |