2014-02-12 4 views
0

Новичок в MySQL и SQL в целом - так, пожалуйста, будьте нежны :-)Улучшение выбора скорости - MySQL - очень большие таблицы

У меня есть таблица с очень большим количеством строк. Таблица составляет:

create table iostat (
pkey  int not null auto_increment, 
serverid int not null, 
datestr char(15) default 'NULL', 
esttime int not null default 0, 

rs  float not null default 0.0, 
ws  float not null default 0.0, 
krs  float not null default 0.0, 
kws  float not null default 0.0, 
wait  float not null default 0.0, 
actv  float not null default 0.0, 
wsvct float not null default 0.0, 
asvct float not null default 0.0, 
pctw  int not null default 0, 
pctb  int not null default 0, 
device varchar(50), 
avgread float not null default 0.0, 
avgwrit float not null default 0.0, 

primary key (pkey), 

index i_serverid (serverid), 
index i_esttime (esttime), 
index i_datestr (datestr), 
index i_rs (rs), 
index i_ws (ws), 
index i_krs (krs), 
index i_kws (kws), 
index i_wait (wait), 
index i_actv (actv), 
index i_wsvct (wsvct), 
index i_asvct (asvct), 
index i_pctb (pctb), 
index i_device (device), 
index i_servdate (serverid, datestr), 
index i_servest (serverid, esttime) 

) 
engine = MyISAM 
data directory = '${IOSTATdatadir}' 
index directory = '${IOSTATindexdir}' 
; 

Сейчас таблица имеет 834 317 203 строки.

Да - мне нужны все данные. Организация данных на высшем уровне по дате сбора (datestr). Это CHAR вместо даты, чтобы сохранить определенный формат даты, который я использую для различных сценариев загрузки, извлечения и анализа.

Каждый день добавляется около 16 000 000 строк.

Одна из операций я хотел бы ускорить это (предел, как правило, 50, но в пределах от 10 до 250):

create table TMP_TopLUNsKRead 
    select 
    krs, device, datestr, esttime 
    from 
    iostat 
    where 
    ${WHERECLAUSE} 
    order by 
    krs desc limit ${Limit}; 

WhereClause является:

serverid = 29 and esttime between X and Y and device like '%t%' 

, где Х и У временные метки, охватывающие от 4 минут до 24 часов.

Я бы предпочел не менять двигатель БД. Это позволяет мне помещать данные и индексы на отдельные диски, что давало мне значительную общую производительность. Это также составляет 1,6 миллиарда строк, что потребует безумного количества времени для перезагрузки.

+1

Какой результат вы получите, если добавить EXPLAIN в начало этого запроса? –

+2

Элемент с наибольшим влиянием производительности в вашем запросе - '$ {WHERECLAUSE}', было бы полезно показать нам, для чего установлена ​​эта переменная. – fvu

+0

Я знал, что я забуду это: serverid = 29 и esttime между X и Y и устройством вроде «% t%» - X и Y - временные метки, которые занимают от 4 минут до 24 часов. – opsdog

ответ

3
device like '%t%' 

Это убийца. Ведущий % означает, что это поиск всего столбца или индекса, если он проиндексирован, а не индексный поиск. Посмотрите, можете ли вы обойтись без ведущего %.

+1

Я боялся этого. Данные имеют формат cXtYYYYYYY ... где X может меняться и не предсказуем. Реальное исправление заключается в добавлении поля device_type. Наличие «t» различает два типа данных устройства. – opsdog

+0

@opsdog, с таблицей gigarow, проектирующей схему, подлежащую поиску, является жизненно важной. Вы даже можете подумать о переходе на другую RDMS, такую ​​как PostgreSQL, которая предлагает индексы функций и нисходящие индексы. –

0

Не зная, что находится в вашем ${WHERECLAUSE}, вы не можете помочь. Вы правы, что это огромная таблица.

Но вот наблюдение, которое могло бы помочь: Соединение индекс покрытия на

(krs, device, datestr, esttime) 

может ускорить упорядочение и извлечение вашего подмножества данных.

+0

Я поместил несколько составных индексов покрытия на основе конкретных операций, подобных этому, но вывел их как время загрузки новых данных стало возмутительным. Я, вероятно, верну его обратно - в настоящее время создание этой таблицы темпа (и еще 2 таких, как она) является самой медленной повторяющейся задачей, которую я делаю против этой таблицы. – opsdog

+0

И теперь, когда я перечитываю и полностью понимаю ваш комментарий ... Я мог бы это сделать, но у меня нет никаких проблем с производительностью извлечения из таблиц TMP _.... Они, как правило, очень маленькие подмножества таблицы iostat. – opsdog

Смежные вопросы