Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использование MySQL для хранилища данных / 25 сообщений из 41, страница 1 из 2
26.01.2014, 14:08:30
    #38538203
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Здравствуйте. Необходимо создать хранилище данных, примерные параметры которого следующие: максимальный размер таблицы фактов 30-40 млн записей (2-2,5 Гб), число измерений около 20. Для этой цели выбрал MySQL, но пока не могу добиться приемлемой производительности: аналитические запросы выполняются в среднем по 60-80 секунд. Для теста использую виртуальную машину (2 ядра, 2 гб памяти), все на движке MyISAM. Профилирование показывает, что почти все время занимает копирование временной таблицы на жесткий диск, а также что вместо индексов используется полное сканирование.
Хотел бы узнать, какие аппаратные показатели будут теоретически достаточны для хд с заданными объемами и как настроить MySQL на эффективную обработку аналитических запросов? Число одновременных пользователей будет не больше 1-2. Можно ли сделать, что бы все операции чтения производились в памяти?
...
Рейтинг: 0 / 0
26.01.2014, 14:16:16
    #38538211
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Вот некоторые параметры my.cnf (взяты из my-huge.cnf).
key_buffer_size = 384M
sort_buffer_size = 2M
read_buffer_size = 2M
myisam_sort_buffer_size = 64M
max_heap_table_size = 1024M
tmp_table_size = 1024M
...
Рейтинг: 0 / 0
26.01.2014, 14:27:37
    #38538217
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
запросы к базе кривые
...
Рейтинг: 0 / 0
26.01.2014, 14:29:10
    #38538219
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
bochkov,
Запросы формирует Mondrian от Pentaho. Сомнительно, что они кривые.
...
Рейтинг: 0 / 0
26.01.2014, 15:11:25
    #38538249
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
1. Обычно, в таких случаях приводят описание таблиц, что бы можно было правильно осмыслить Вашу фразу "вместо индексов используется полное сканирование".
2. И, естественно, сразу же напрашивается реплика - "запрос в студию". Т.е., приведите хотя-бы самый простой запрос, который выполняется долго и, по показаниям профайлера, не использует имеющиеся индексы.
3. Если хотите все загнать в память, то для такой базы нужно, как минимум, 6-8 гигов памяти и соответственно увеличить нужные параметры. Ну, или поставьте SSD.
4. Использование OLAP-сервера еще не гарантирует генерацию оптимальных запросов.
...
Рейтинг: 0 / 0
26.01.2014, 15:14:01
    #38538255
netwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Чтобы построить аналитику по всем данным, нужно просто построить аналитику по всем данным и считать все эти данные.
Чего тут удивляться?
...
Рейтинг: 0 / 0
26.01.2014, 15:26:04
    #38538264
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
В том-то и дело, что реплику ТС про "аналитические запросы" можно интрепретировать по разному - от простейшей аналитики типа "сумма всех продаж по конкретному клиенту" до сложных отчетов, которые, обычно, формируются не одним запросом, а подготавливаются в хранимке или "тянуться" промежуточные данные на клиента, где в таблицах в памяти все и формируется в готовые отчеты.
И, что бы не гадать, я и попросил у ТС пункт 2.
...
Рейтинг: 0 / 0
26.01.2014, 17:05:25
    #38538318
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Вот таблица поменьше (7 млн записей):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE AbonentWH.Payment (
  PaymentID int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор оплаты',
  PublicUtilitiesID tinyint(4) UNSIGNED NOT NULL COMMENT 'Идентификатор организации ЖКХ',
  PaymentSourceID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор источника оплаты',
  PaymentMethodID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор способа оплаты',
  DateDiscountID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор даты учета оплаты',
  DatePaymentID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор фактической даты оплаты',
  DateID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор даты, за которую осуществлена оплата',
  ServiceID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор услуги',
  AbonentID int(11) UNSIGNED NOT NULL COMMENT 'Идентификатор абонента',
  SubsidyID tinyint(4) UNSIGNED NOT NULL COMMENT 'Идентификатор субсидирования',
  ContractorID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор внешней организации',
  PaymentTypeID tinyint(4) UNSIGNED NOT NULL COMMENT 'Идентификатор типа оплаты',
  PrimaryDocumentCode int(11) UNSIGNED NOT NULL COMMENT 'Код первичного документа об оплате',
  TicketCode int(11) UNSIGNED NOT NULL COMMENT 'Код квитанции об оплате',
  DiscountDay tinyint(4) UNSIGNED NOT NULL COMMENT 'День учета оплаты',
  DiscountMonth tinyint(4) UNSIGNED NOT NULL COMMENT 'Месяц учета оплаты',
  DiscountYear smallint(6) UNSIGNED NOT NULL COMMENT 'Год учета оплаты',
  PaymentSum decimal(18, 4) NOT NULL COMMENT 'Сумма оплаты',
  RegistrationDate date NOT NULL COMMENT 'Дата регистрации записи в ХД',
  PRIMARY KEY (PaymentID),
  INDEX IDX_Payment_AbonentID (AbonentID),
  INDEX IDX_Payment_ContractorID (ContractorID),
  INDEX IDX_Payment_DateDiscountID (DateDiscountID),
  INDEX IDX_Payment_DateID (DateID),
  INDEX IDX_Payment_DatePaymentID (DatePaymentID),
  INDEX IDX_Payment_PaymentMethodID (PaymentMethodID),
  INDEX IDX_Payment_PaymentSourceID (PaymentSourceID),
  INDEX IDX_Payment_PaymentTypeID (PaymentTypeID),
  INDEX IDX_Payment_ServiceID (ServiceID),
  INDEX IDX_Payment_SubsidyID (SubsidyID)
)
ENGINE = MYISAM



Пример запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
select
    `Service`.`ResourceName` as `c0`,
    `Service`.`ServiceName` as `c1`,
    `PaymentSource`.`PaymentSourceName` as `c2`,
    `Date_2`.`Year` as `c3`,
    `Date_2`.`Quarter` as `c4`,
    `Date_2`.`Month` as `c5`,
    `Date_2`.`Day` as `c6`,
    sum(`Payment`.`PaymentSum`) as `m0`,
    count(distinct `Payment`.`TicketCode`) as `m1`
from
    `Service` as `Service`,
    `Payment` as `Payment`,
    `PaymentSource` as `PaymentSource`,
    `Date` as `Date_2`
where
    `Payment`.`ServiceID` = `Service`.`ServiceID`
and
    `Service`.`ResourceName` in ('Водоотведение', 'Горячее водоснабжение', 'Холодное водоснабжение')
and
    `Service`.`ServiceName` in ('Водоотведение', 'Горячая вода', 'Холодная вода')
and
    `Payment`.`PaymentSourceID` = `PaymentSource`.`PaymentSourceID`
and
    `PaymentSource`.`PaymentSourceName` in ('КВЦ', 'Касса', 'Ошибочно проведенная оплата', 'Перерасчет квитанций', 'По суду', 'Реестры оплаты из ЦОКП', 'Списание по приказу')
and
    `Payment`.`DateDiscountID` = `Date_2`.`DateID`
and
    `Date_2`.`Year` = 2013
and
    `Date_2`.`Quarter` = 3
and
    `Date_2`.`Month` = '9'
group by
    `Service`.`ResourceName`,
    `Service`.`ServiceName`,
    `PaymentSource`.`PaymentSourceName`,
    `Date_2`.`Year`,
    `Date_2`.`Quarter`,
    `Date_2`.`Month`,
    `Date_2`.`Day`


ПрофилированиеSorting result 9,488223 83,72
Copying to tmp table 1,447273 12,77
Sending data 0,344958 3,04
statistics 0,038657 0,34
removing tmp table 0,009193 0,08
Creating tmp table 0,003196 0,03
freeing items 0,000843 0,01
starting 0,000168 0,00
init 0,000074 0,00
end 0,000071 0,00
preparing 0,000070 0,00
Opening tables 0,000058 0,00
optimizing 0,000025 0,00
checking permissions 0,000016 0,00
System lock 0,000015 0,00
closing tables 0,000014 0,00
logging slow query 0,000006 0,00
executing 0,000005 0,00
cleaning up 0,000004 0,00
query end 0,000002 0,00

План
Код: plaintext
1.
2.
3.
Date_2	1	SIMPLE	index_merge	PRIMARY,IDX_Date_Quarter,IDX_Date_Year,IDX_Date_Month	IDX_Date_Year,IDX_Date_Month	2,1		32	Using intersect(IDX_Date_Year,IDX_Date_Month); Using where; Using temporary; Using filesort
Payment	1	SIMPLE	ref	IDX_Payment_DateDiscountID,IDX_Payment_PaymentSourceID,IDX_Payment_ServiceID	IDX_Payment_DateDiscountID	2	AbonentWH.Date_2.DateID	12104	
Service	1	SIMPLE	eq_ref	PRIMARY	PRIMARY	2	AbonentWH.Payment.ServiceID	1	Using where
PaymentSource	1	SIMPLE	eq_ref	PRIMARY	PRIMARY	2	AbonentWH.Payment.PaymentSourceID	1	Using where
...
Рейтинг: 0 / 0
26.01.2014, 17:09:13
    #38538322
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Здесь часть индексов используется и копирование на диск меньше, обычно выходит хуже.
И еще есть такая проблема, что почему-то при запуске некоторых запросов резко переполняется папка временных файлов /tmp (за секунды создаются два файла по 3.1 Гб) и отображается ошибка.
...
Рейтинг: 0 / 0
26.01.2014, 20:53:13
    #38538431
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
автор `Date_2`.`Year` = 2013
and
`Date_2`.`Quarter` = 3
and
`Date_2`.`Month` = '9'
как нагнуть сервер. эпопея в трех частях.
...
Рейтинг: 0 / 0
26.01.2014, 21:13:07
    #38538444
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Kikki,

Перечитайте секцию оптимизации Мондриана.
Например , посмотрите в следуюших направлениях:

1. СервисНайм и РесорсеНайм -- проанализивуйте,
если они строго завязаны то можно поставить
оптимизационный хинт "ДепендентМесурмент"
и убрать одно из них из Групбая

2. Добавьте ( если нет ) во временую ось полную дату
(кроме размазки по году-месяцу-дню).
Потом аналитику вытаскивать не по набору год-месяц-день
а по конкретному дню

mуsql сделал неплохую оптимизацию -- интерсект трех индексов,
но единый индекс на конкретную дату будет еше лучше.
После этого Год, Месяц и День снова можно поставить как
ДепендантМесурмент и они вылетят из ГрупБая.

Если МОндриан будет брыкатся -- зафорсить индекс на Дату а не на
интерсект
...
Рейтинг: 0 / 0
26.01.2014, 21:15:13
    #38538448
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
`PaymentSource`.`PaymentSourceName` in ('КВЦ', 'Касса', 'Ошибочно проведенная оплата', 'Перерасчет квитанций', 'По суду', 'Реестры оплаты из ЦОКП', 'Списание по приказу')

это полный набор значений? если полный, то
его надо убрать вообше как филтр.
...
Рейтинг: 0 / 0
26.01.2014, 21:16:32
    #38538450
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
если таки все равно медлено,
прочитайте секцию про пре-агрегаты.
...
Рейтинг: 0 / 0
26.01.2014, 23:50:30
    #38538520
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
javajdbc,
Спасибо. Если вы имеете в виду parent-child иерархию сделать, то мондриан позволяет только одноуровневые иерархии, также в кубах, которые содержат parent-child иерархии нельзя использовать distinct-count показатели, которые мне нужны.
PaymentSource находится не в фильтре, т.к. мне нужно визуально отобразить суммы по всем источникам оплаты, а не просто посчитать их.
Дискуссия переместилась в сторону мондриана, а хотелось обсудить настройку производительности mysql для задач olap. На какие настройки обратить внимание? Почему при некоторых запросах может происходить переполнение папки /tmp (заполняется 7 гб при объеме таблицы, к которой происходит запрос в 350 мб и индексов к ней 500 мб)?
...
Рейтинг: 0 / 0
27.01.2014, 00:01:52
    #38538523
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
И стоит ли подумать о секционировании? И по какому критерию в этом случае делать секции для приведенной таблицы? По полю DateDiscountID, которое чаще всего используется?
...
Рейтинг: 0 / 0
27.01.2014, 00:25:04
    #38538533
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Koukibochkov,
Запросы формирует Mondrian от Pentaho. Сомнительно, что они кривые.

:-)
...
Рейтинг: 0 / 0
27.01.2014, 06:17:52
    #38538582
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
>> Если вы имеете в виду parent-child иерархию сделать, то мондриан позволяет только одноуровневые иерархии, также в кубах, которые содержат parent-child иерархии нельзя использовать distinct-count показатели, которые мне нужны.

Нет я предлагаю в уже имеюшейся звездной таблице ДАТЫ добявить еше одно поле
ГОД_МЕСЯЦ и тогда конкретно этот СКЛ избавится от

and `Date_2`.`Year` = 2013
and `Date_2`.`Quarter` = 3
and `Date_2`.`Month` = '9'

и останется...

date_2.year_mon = '2013-09'

...с одиночным индексом

>> PaymentSource находится не в фильтре, т.к. мне нужно визуально отобразить суммы по всем источникам оплаты, а не просто посчитать их.

если....

and `PaymentSource`.`PaymentSourceName` in ('КВЦ', 'Касса', 'Ошибочно проведенная оплата', 'Перерасчет квитанций', 'По суду', 'Реестры оплаты из ЦОКП', 'Списание по приказу')

... есть список ВСЕХ имеюшиеся PaymentSourceName, то эта строчка вообше не нужна
в WHERE секции, а только в GROUP BY секции

Как имено сделать оптимизацию такого рода в генераторе, я не в курсе.

>> Дискуссия переместилась в сторону мондриана, а хотелось обсудить настройку производительности mysql для задач olap. На какие настройки обратить внимание?

В первую очередь надо попытатся упростить запрос на лОГИЧЕСКОМ уровне,
на уровне здравых запросов и с помошью оптимизции Мондриана.

Потом надо понять/оценить узкие места и только потом, после логическогой оптимизации
смотреть на настройки мускл-а

>> Почему при некоторых запросах может происходить переполнение папки /tmp (заполняется 7 гб при объеме таблицы, к которой происходит запрос в 350 мб и индексов к ней 500 мб)?

может быть сбился/потерялся/не используется индекс и
произошел полный кортезиан 350МБ с табличкой на
всево-лишь 20 записей -- и вот вам 7ГБ каких-нибудь временых данных.
...
Рейтинг: 0 / 0
27.01.2014, 06:38:13
    #38538583
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
KoukiВот таблица поменьше (7 млн записей):

CREATE TABLE AbonentWH.Payment (
PaymentID int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор оплаты',
PublicUtilitiesID tinyint(4) UNSIGNED NOT NULL COMMENT 'Идентификатор организации ЖКХ',
PaymentSourceID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор источника оплаты',
PaymentMethodID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор способа оплаты',
DateDiscountID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор даты учета оплаты',
DatePaymentID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор фактической даты оплаты',
DateID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор даты, за которую осуществлена оплата',
ServiceID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор услуги',
AbonentID int(11) UNSIGNED NOT NULL COMMENT 'Идентификатор абонента',
SubsidyID tinyint(4) UNSIGNED NOT NULL COMMENT 'Идентификатор субсидирования',
ContractorID smallint(6) UNSIGNED NOT NULL COMMENT 'Идентификатор внешней организации',
PaymentTypeID tinyint(4) UNSIGNED NOT NULL COMMENT 'Идентификатор типа оплаты',
PrimaryDocumentCode int(11) UNSIGNED NOT NULL COMMENT 'Код первичного документа об оплате',
TicketCode int(11) UNSIGNED NOT NULL COMMENT 'Код квитанции об оплате',
DiscountDay tinyint(4) UNSIGNED NOT NULL COMMENT 'День учета оплаты',
DiscountMonth tinyint(4) UNSIGNED NOT NULL COMMENT 'Месяц учета оплаты',
DiscountYear smallint(6) UNSIGNED NOT NULL COMMENT 'Год учета оплаты',
PaymentSum decimal(18, 4) NOT NULL COMMENT 'Сумма оплаты',
RegistrationDate date NOT NULL COMMENT 'Дата регистрации записи в ХД',
PRIMARY KEY (PaymentID),
INDEX IDX_Payment_AbonentID (AbonentID),
INDEX IDX_Payment_ContractorID (ContractorID),
INDEX IDX_Payment_DateDiscountID (DateDiscountID),
INDEX IDX_Payment_DateID (DateID),
INDEX IDX_Payment_DatePaymentID (DatePaymentID),
INDEX IDX_Payment_PaymentMethodID (PaymentMethodID),
INDEX IDX_Payment_PaymentSourceID (PaymentSourceID),
INDEX IDX_Payment_PaymentTypeID (PaymentTypeID),
INDEX IDX_Payment_ServiceID (ServiceID),
INDEX IDX_Payment_SubsidyID (SubsidyID)
)
ENGINE = MYISAM



Пример запроса:

select
`Service`.`ResourceName` as `c0`,
`Service`.`ServiceName` as `c1`,
`PaymentSource`.`PaymentSourceName` as `c2`,
`Date_2`.`Year` as `c3`,
`Date_2`.`Quarter` as `c4`,
`Date_2`.`Month` as `c5`,
`Date_2`.`Day` as `c6`,
sum(`Payment`.`PaymentSum`) as `m0`,
count(distinct `Payment`.`TicketCode`) as `m1`
from
`Service` as `Service`,
`Payment` as `Payment`,
`PaymentSource` as `PaymentSource`,
`Date` as `Date_2`
where
`Payment`.`ServiceID` = `Service`.`ServiceID`
and
`Service`.`ResourceName` in ('Водоотведение', 'Горячее водоснабжение', 'Холодное водоснабжение')
and
`Service`.`ServiceName` in ('Водоотведение', 'Горячая вода', 'Холодная вода')
and
`Payment`.`PaymentSourceID` = `PaymentSource`.`PaymentSourceID`
and
`PaymentSource`.`PaymentSourceName` in ('КВЦ', 'Касса', 'Ошибочно проведенная оплата', 'Перерасчет квитанций', 'По суду', 'Реестры оплаты из ЦОКП', 'Списание по приказу')
and
`Payment`.`DateDiscountID` = `Date_2`.`DateID`

AND Date_2.yesr_mon = '2013-03'

and
`Date_2`.`Year` = 2013
and
`Date_2`.`Quarter` = 3
and
`Date_2`.`Month` = '9'
group by
`Service`.`ResourceName`,
`Service`.`ServiceName`,
`PaymentSource`.`PaymentSourceName`,
`Date_2`.`Year`,
`Date_2`.`Quarter`,
`Date_2`.`Month`,
`Date_2`.`Day`


ПрофилированиеSorting result 9,488223 83,72
Copying to tmp table 1,447273 12,77
Sending data 0,344958 3,04
statistics 0,038657 0,34
removing tmp table 0,009193 0,08
Creating tmp table 0,003196 0,03
freeing items 0,000843 0,01
starting 0,000168 0,00
init 0,000074 0,00
end 0,000071 0,00
preparing 0,000070 0,00
Opening tables 0,000058 0,00
optimizing 0,000025 0,00
checking permissions 0,000016 0,00
System lock 0,000015 0,00
closing tables 0,000014 0,00
logging slow query 0,000006 0,00
executing 0,000005 0,00
cleaning up 0,000004 0,00
query end 0,000002 0,00

План
Код: plaintext
1.
2.
3.
Date_2	1	SIMPLE	index_merge	PRIMARY,IDX_Date_Quarter,IDX_Date_Year,IDX_Date_Month	IDX_Date_Year,IDX_Date_Month	2,1		32	Using intersect(IDX_Date_Year,IDX_Date_Month); Using where; Using temporary; Using filesort
Payment	1	SIMPLE	ref	IDX_Payment_DateDiscountID,IDX_Payment_PaymentSourceID,IDX_Payment_ServiceID	IDX_Payment_DateDiscountID	2	AbonentWH.Date_2.DateID	12104	
Service	1	SIMPLE	eq_ref	PRIMARY	PRIMARY	2	AbonentWH.Payment.ServiceID	1	Using where
PaymentSource	1	SIMPLE	eq_ref	PRIMARY	PRIMARY	2	AbonentWH.Payment.PaymentSourceID	1	Using where



судя по плану у вас 12К записей в день. в запросе 1 месяц - 30 дней , значит 400К записей.
Основное время 10 сец, 83,72% занял сортинг -- похоже на сортировку для
группировки на диске.

Опятже, эта проблема с сортировкой может пропасть после
Мондриан оптимизации (например с использованием сквозного индекса по YEAR_MON).
А если останется -- надо думать про настройки сервера (наконецто!).

Тут надо попросить более опытных товаришей в плане расчетов
ресурсов: как настроить сорт буфера для
400К записей типа AbonentWH.Payment

(очевидно надо заменить 3 поля для ДискаунтДатеДей/Монс/Уеар
на ДискаунтДатеИД, или это разные ДИскаунты???)

Сами тоже можете попробовать настроить буфера с помошью утилиты:

wget mysqltuner.pl
perl mysqltuner.pl
...
Рейтинг: 0 / 0
28.01.2014, 13:44:05
    #38540453
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
javajdbc,
DateDiscountID уже есть в таблице Payment, посмотрите. Через него и происходит связь с таблицей Date. Поля DiscountYear/Month/Day не используются в запросах.
...
Рейтинг: 0 / 0
28.01.2014, 18:08:04
    #38541032
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Koukijavajdbc,
DateDiscountID уже есть в таблице Payment, посмотрите. Через него и происходит связь с таблицей Date. Поля DiscountYear/Month/Day не используются в запросах.

Я видел что там есть и ИД и отдельные значения.
Если это одно и тоже, то отдельные значения надо удалить
чтобы сократить размер (хоть немного).
Но может это были разные дискаунты, было непонятно до вашего уточнения.
...
Рейтинг: 0 / 0
28.01.2014, 19:18:20
    #38541145
Aleksandr Kuzminsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
KoukiЗдравствуйте. Необходимо создать хранилище данных, примерные параметры которого следующие: максимальный размер таблицы фактов 30-40 млн записей (2-2,5 Гб), число измерений около 20. Для этой цели выбрал MySQL, но пока не могу добиться приемлемой производительности: аналитические запросы выполняются в среднем по 60-80 секунд. Для теста использую виртуальную машину (2 ядра, 2 гб памяти), все на движке MyISAM. Профилирование показывает, что почти все время занимает копирование временной таблицы на жесткий диск, а также что вместо индексов используется полное сканирование.
Хотел бы узнать, какие аппаратные показатели будут теоретически достаточны для хд с заданными объемами и как настроить MySQL на эффективную обработку аналитических запросов? Число одновременных пользователей будет не больше 1-2. Можно ли сделать, что бы все операции чтения производились в памяти?

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

Все таблицы надо перевести в InnoDB. Сегодня нет смысла использовать MyISAM. Дело в том, что в MyISAM кешируются только индексы (key_buffer), данные будут читаться с диска. И несмотря на то, что есть кеш файловой системы, он все равно хуже, чем специализированный кеш InnoDB (innodb_buffer). То есть, таблицы в InnoDB, для буфер пула выделите как минимум 2.5G памяти (соответственно, сервер должен иметь достаточно памяти).

Временные таблицы - это результат плохих запросов и плохих индексов. Если проблему не получится исправить индексами укажите временную (tmpdir) директорию на RAM диске ( чтто-то вроде /dev/shm/mysql)
...
Рейтинг: 0 / 0
28.01.2014, 19:21:29
    #38541149
Aleksandr Kuzminsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Koukikey_buffer_size = 384M


Не используйте MyISAM.

Koukisort_buffer_size = 2M


OK

Koukiread_buffer_size = 2M


OK

Koukimax_heap_table_size = 1024M
tmp_table_size = 1024M


Аккуратно с этими буферами. Если MySQL начнет свопиться - все умрет. Я бы оставил их равными дефолту и пытался избавляться от временных таблиц. Если не получится - тогда tmpdir на RAM
...
Рейтинг: 0 / 0
28.01.2014, 20:51:31
    #38541247
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Aleksandr KuzminskyKoukikey_buffer_size = 384M


Не используйте MyISAM.

Koukisort_buffer_size = 2M


OK

Koukiread_buffer_size = 2M


OK

Koukimax_heap_table_size = 1024M
tmp_table_size = 1024M


Аккуратно с этими буферами. Если MySQL начнет свопиться - все умрет. Я бы оставил их равными дефолту и пытался избавляться от временных таблиц. Если не получится - тогда tmpdir на RAM

ну неужели же я дожил до этого времени, когда хором люди в конфе по мусклю рекомендуют НЕ использовать ISAM ...

не просто реально счастье...
...
Рейтинг: 0 / 0
28.01.2014, 21:04:33
    #38541255
Aleksandr Kuzminsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
MasterZivну неужели же я дожил до этого времени, когда хором люди в конфе по мусклю рекомендуют НЕ использовать ISAM ...

не просто реально счастье...

А что, раньше рекомендовали?
Если есть InnoDB, то MyISAM использовать не вижу смысла. Ну ок, full text индексы до недавнего не поддерживались в InnoDB.
Кроме того, MyISAM не развивается как минимум лет пять.

Хорошо, что в 5.5 InnoDB по дефолту, раньше многие использовали MyISAM потому что это был дефолт
...
Рейтинг: 0 / 0
28.01.2014, 22:33:28
    #38541314
Kouki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование MySQL для хранилища данных
Aleksandr Kuzminsky,
При выборе движка руководствовался статьями, где для средств аналитики советуют использовать MyISAM. Транзакционность и надежность мне не первостепенны, главное производительность. В современных условиях какой из движков наиболее оптимально использовать для построения хранилища данных: InnoDB, XtraDB, MyISAM, Aria?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использование MySQL для хранилища данных / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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