powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql и три миллиона записей
6 сообщений из 6, страница 1 из 1
mysql и три миллиона записей
    #32278190
Heman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тачка:
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
...
Рейтинг: 0 / 0
mysql и три миллиона записей
    #32284393
alex_24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет чювак - меня серъезно заинтересовала твоя идея.
Я сам недавно колбасился с базой 1.000.000 записей.

3.000.000 это не много. Точно.
Телега нормальная.

Тебе надо бы поточнее описать:
Как сильно загружин CPU при таких выборках.
Какова величина результирующего набора при таких выборках - принципиально важно имею ввиду не LIMIT.
Винт видимо сверхбыстрый и не нужен, так как я бы все данные или перевел в пямять или что лучше - кешировал бы.

Зачем тебе таблицы делать при выборке, да ещё и не темповые.

Таблицу нужно построить грамотнее:
Укарати поля как можно меньше. 1 знак это тоже класс даже для INT.
Выкинь поле типа date. Мочи все в INT с помощю UNIXTIMESTAMP.

Выкинь свои индексы, они просто "хавайся в жито":
Многие из них можно объеденить и использовать для твоих нескольких запросов. Кстате ты для каждого получается строиш свой индекс.
Одно и то же:
Код: plaintext
1.
KEY i_alrodedu (allocation, roomsize, departure, duration), 
KEY i_alrodedupr (allocation, roomsize, departure, duration, price), 

Индексы - "левоориентированы". Оставь только второй, и для он будет использован и для запроса, для каторого ты приготовил первый индекс.

Можно переформировать и обьеденить в один индекс:
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

Там все конкретно обсутим и протестить можем.
Настройка - дело тонкое.
Сам несколько месяцев ..бался над своей системой, пока не отладил.
...
Рейтинг: 0 / 0
mysql и три миллиона записей
    #32285047
Phantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMHO:
переходи на Oracle:
возможностей для оптимизации - уйма.
у нас в базе порядка 5.000.000 записей - и ничего запросы типа
select * from sometable where name like '%something%'
вообще без проблемм ботаются
...
Рейтинг: 0 / 0
mysql и три миллиона записей
    #32289441
alex_24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И за сколько выполняется у тебя этот запрос?
Только реально.

Вообще - захиди ко мне на форум.
http://forum.webcommand.ru
...
Рейтинг: 0 / 0
mysql и три миллиона записей
    #32297311
alexzh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ребята. Я уверен что на 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.
Конфиг я в понедельник смогу выложить, т.к. он на работе, а я дома. Если конечно он нужен.
...
Рейтинг: 0 / 0
mysql и три миллиона записей
    #32297314
Heman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую побороться с типами данных и прибить индексы.

Темповая табличка нужна для полследующего джоина к ней словариков, со значением данных. Не темповая потому как была проблема памяти, артефакт вообщем то.

Иду на форум, где мне помогут :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql и три миллиона записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]