|
mysql и три миллиона записей
|
|||
---|---|---|---|
#18+
Тачка: PIV 3ггц, 2гб рам, 18 гб сказёвый винт, Софт: Freebsd 4.8, mysql 4.0.13 На машине ничего кроме сиквела не крутиться Есть таблица в которой есть чуть более 3 милионов записей. Очень тормозно отрабатывают селекты. Упор оптимизации - для самых популярных запросов свой ключ. Погите советом. Готов сменить базу данных (думаю о постгрес). Возможны более конструктивные изменения(MSSQL), но не хотелось бы. Конфиг: [mysqld] port = 3306 socket = /tmp/mysql.sock skip-locking key_buffer = 512M max_allowed_packet = 16M table_cache = 1024 sort_buffer_size = 16M read_buffer_size = 16M myisam_sort_buffer_size = 512M thread_cache = 8 query_cache_size= 512M max_heap_table_size=512M max_tmp_tables=1024 # Try number of CPU's*2 for thread_concurrency thread_concurrency = 8 Полный конфиг здесь: http://www.qqq.ru/my.cnf Структура таблицы, неоптимизированны типы данных, их можно было бы сделать поменьше: CREATE TABLE t_offers_big_83 ( id int(11) NOT NULL auto_increment, visa tinyint(4) DEFAULT '0' NOT NULL, allocation mediumint(5) DEFAULT '0' NOT NULL, country mediumint(9) DEFAULT '0' NOT NULL, resort mediumint(9) DEFAULT '0' NOT NULL, duration mediumint(5) DEFAULT '0' NOT NULL, meal mediumint(5) DEFAULT '0' NOT NULL, roomtype mediumint(5) DEFAULT '0' NOT NULL, price smallint(6) DEFAULT '0' NOT NULL, operator smallint(5) DEFAULT '0' NOT NULL, departure date DEFAULT '0000-00-00' NOT NULL, arrival date DEFAULT '0000-00-00' NOT NULL, roomview smallint(3) DEFAULT '0' NOT NULL, roomsize smallint(3) DEFAULT '0' NOT NULL, ch1from smallint(2) DEFAULT '0' NOT NULL, ch1to smallint(2) DEFAULT '0' NOT NULL, ch2from smallint(2) DEFAULT '0' NOT NULL, ch2to smallint(2) DEFAULT '0' NOT NULL, spo mediumint(7) DEFAULT '0' NOT NULL, roomcat smallint(3) DEFAULT '0' NOT NULL, ticket tinyint(1) DEFAULT '0' NOT NULL, transfer tinyint(1) DEFAULT '0' NOT NULL, insurance tinyint(1) DEFAULT '0' NOT NULL, comment mediumint(7) DEFAULT '0' NOT NULL, inf mediumint(7) DEFAULT '0' NOT NULL, allspo mediumint(9) DEFAULT '0' NOT NULL, active tinyint(1) DEFAULT '0' NOT NULL, PRIMARY KEY (id), KEY i_price (price), KEY i_allocation (allocation), KEY i_roomsize (roomsize), KEY i_departure (departure), KEY i_duration (duration), KEY i_operator (operator), KEY i_roomview (roomview), KEY i_roomtype (roomtype), KEY i_meal (meal), KEY i_alrodedu (allocation, roomsize, departure, duration), KEY i_alrodedupr (allocation, roomsize, departure, duration, price), KEY i_aloprode (allocation, operator, roomsize, departure), KEY i_all (allocation, duration, meal, roomtype, operator, departure, roomview, roomsize, ch1from, ch1to, ch2from, ch2to, allspo), KEY id (id), KEY i_country (country), KEY i_resort (resort), KEY i_corodedupr (country, roomsize, departure, duration, price), KEY i_rerodedupr (resort, roomsize, departure, duration, price), KEY i_rodedu (roomsize, departure, duration), KEY i_rodedupri (price, roomsize, departure, duration, price) ); Распределение данных: allocation 618 country 1 resort 11 duration 14 meal 12 roomtype 39 price 10520 operator 28 departure 164 roomview 14 roomsize 13 ch1from 11 ch1to 16 ch2from 10 ch2to 16 allspo 592 Примеры выборок с таймингом: mysql> create table -> t_usertmp_c51ce410 -> select -> t_offers_big_83.* -> from -> t_offers_big_83 -> use key(i_rodedu) -> where roomsize='14' -> and -> departure>='2003-09-30' -> and -> (duration>='7' and duration<='14') -> order by price asc -> limit 0, 40 -> ; Query OK, 40 rows affected (0.85 sec) Records: 40 Duplicates: 0 Warnings: 0 mysql> create table -> t_usertmp_c51ce410 -> select -> t_offers_big_83.* -> from -> t_offers_big_83 -> use key(i_rodedu) -> where roomsize='14' -> and -> departure>='2003-09-30' -> and -> (duration>='7' and duration<='14') -> and -> roomtype in (7) -> and -> meal in (1) -> order by price asc -> limit 0, 40 -> ; Query OK, 40 rows affected (0.70 sec) Records: 40 Duplicates: 0 Warnings: 0 mysql> create table -> t_usertmp_c51ce410 -> select -> t_offers_big_83.* -> from -> t_offers_big_83 -> use key(i_rodedu) -> where resort in (0, 17) -> and -> roomsize='14' -> and -> departure>='2003-09-30' -> and -> (duration>='7' and duration<='14') -> and -> roomview in (29) -> order by price asc -> limit 0, 40 -> ; Query OK, 0 rows affected (0.53 sec) Records: 0 Duplicates: 0 Warnings: 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2003, 13:17 |
|
mysql и три миллиона записей
|
|||
---|---|---|---|
#18+
Привет чювак - меня серъезно заинтересовала твоя идея. Я сам недавно колбасился с базой 1.000.000 записей. 3.000.000 это не много. Точно. Телега нормальная. Тебе надо бы поточнее описать: Как сильно загружин CPU при таких выборках. Какова величина результирующего набора при таких выборках - принципиально важно имею ввиду не LIMIT. Винт видимо сверхбыстрый и не нужен, так как я бы все данные или перевел в пямять или что лучше - кешировал бы. Зачем тебе таблицы делать при выборке, да ещё и не темповые. Таблицу нужно построить грамотнее: Укарати поля как можно меньше. 1 знак это тоже класс даже для INT. Выкинь поле типа date. Мочи все в INT с помощю UNIXTIMESTAMP. Выкинь свои индексы, они просто "хавайся в жито": Многие из них можно объеденить и использовать для твоих нескольких запросов. Кстате ты для каждого получается строиш свой индекс. Одно и то же: Код: plaintext 1.
Индексы - "левоориентированы". Оставь только второй, и для он будет использован и для запроса, для каторого ты приготовил первый индекс. Можно переформировать и обьеденить в один индекс: KEY i_corodedupr (country, roomsize, departure, duration, price), KEY i_rerodedupr (resort, roomsize, departure, duration, price), KEY i_rodedu (roomsize, departure, duration), KEY i_rodedupri (price, roomsize, departure, duration, price) и переработать порядок столбцов в запросе!!! Настройки памяти у MySQL что то мне не нравятса (посмотрю - снажу позже) Я планирую, что таблица у тебя влезит в 1Gig У меня на 1 миллионе в секунде примерно таких 190 запросов к базе проскакивает (CPU 1500 512Mb). Предпологаю - сильно тормозит твои CREATE TABLE при выборке (это просто жуть для меня). Или тебе так надо - генерить пно разных таблиц для отчетов. Приглашаю тебя к себе на форум http://forum.webcommand.ru/index.php Там все конкретно обсутим и протестить можем. Настройка - дело тонкое. Сам несколько месяцев ..бался над своей системой, пока не отладил. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2003, 23:10 |
|
mysql и три миллиона записей
|
|||
---|---|---|---|
#18+
IMHO: переходи на Oracle: возможностей для оптимизации - уйма. у нас в базе порядка 5.000.000 записей - и ничего запросы типа select * from sometable where name like '%something%' вообще без проблемм ботаются ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2003, 14:01 |
|
mysql и три миллиона записей
|
|||
---|---|---|---|
#18+
И за сколько выполняется у тебя этот запрос? Только реально. Вообще - захиди ко мне на форум. http://forum.webcommand.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2003, 02:19 |
|
mysql и три миллиона записей
|
|||
---|---|---|---|
#18+
Да ребята. Я уверен что на MSQL будет еще куда хуже. На счет Oracle не уверен, но помоему тот же тормоз будет, хотя против него ничего не имею. Если же радикально менять, то не на альтернатив типа реалиационных баз, вот переход на сетевую версию БД, вот это решение. У нас на предприятии стоит MDBS сетевая. Крутая штука, работает еще под досом, на тачках типа пне 1 200ммх. Не надо никаких там пнев 4. Выборка происходит за считанные секунды, причем база накопилась за все время деятельности предприятия, а это лет 10-12. Ну это так. А теперь к MySQl Не могу сказать в чем проблема у вас именно. Привожу свой пример работы БД. У меня P-II 350, 384МБ, dbyn IDE 10 fujitsu. Так вот нам прислали на DVD базу по запчастям от фирмы Volvo. Все ее модели грузовые и легковые. Там риснки описание и т.д. Вся база занимает физически на диске чуть более 4 гиг. В них есть две таблицы в которых > 1 200 000 записей остальные по меньше будут. Так вот если задать запрос по выборке записи. То процессор конечно на пару сек до 99% подскакивает (к сожалению работает под Win2000), но факт то что поиск и выборки делаются не более 1 минуты (енто с P-200MMX/32Мб). Все работает через веб интерфейс, что еще замедляет работу, правда если запрос делать через сеть и с Пня 3 1Гц, то гораздо быстрее. Наши программисты уверяют что на MDBS все это обработается как семечки. Но я бы остался на MySQL. Конфиг я в понедельник смогу выложить, т.к. он на работе, а я дома. Если конечно он нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2003, 00:54 |
|
mysql и три миллиона записей
|
|||
---|---|---|---|
#18+
Попробую побороться с типами данных и прибить индексы. Темповая табличка нужна для полследующего джоина к ней словариков, со значением данных. Не темповая потому как была проблема памяти, артефакт вообщем то. Иду на форум, где мне помогут :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2003, 01:33 |
|
|
start [/forum/topic.php?fid=47&msg=32285047&tid=1855702]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 176ms |
0 / 0 |