Новичок в 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 миллиарда строк, что потребует безумного количества времени для перезагрузки.
Какой результат вы получите, если добавить EXPLAIN в начало этого запроса? –
Элемент с наибольшим влиянием производительности в вашем запросе - '$ {WHERECLAUSE}', было бы полезно показать нам, для чего установлена эта переменная. – fvu
Я знал, что я забуду это: serverid = 29 и esttime между X и Y и устройством вроде «% t%» - X и Y - временные метки, которые занимают от 4 минут до 24 часов. – opsdog