Помогите с оптимизацией таблицы (около 200 тысяч записей)

willwin

Guest
Помогите с оптимизацией таблицы (около 200 тысяч записей)

Всем привет!
Возникла проблема. У нас на портале ведётся лог показа внутренних баннеров. В последнее время лог стал разрастаться до примерно 200 тысяч записей в сутки. Каждую ночь он обнуляется.
Так вот.. нарисовалась такая картина

# Query_time: 11 Lock_time: 0 Rows_sent: 0 Rows_examined: 0
INSERT INTO reklama_show_log (slot,banner,time,ip,order_id) VALUES ..

11 секунд на вставку!

Помогите пожалуйста советом, как тут поступить? Таблицу переделать как-то или логику хранения.

Структура таблицы:

CREATE TABLE reklama_show_log (
id int(15) NOT NULL auto_increment,
slot int(15) NOT NULL default '0',
banner int(15) NOT NULL default '0',
time int(15) NOT NULL default '0',
ip varchar(15) NOT NULL default '',
order_id int(15) NOT NULL default '0',
PRIMARY KEY (id),
KEY ip (ip,slot,banner,order_id)
) TYPE=InnoDB;

InnoDB посоветовали использовать в службе поддержки. Сказали, что оно, якобы, оптимальнее для INSERT.

Заранее спасибо!
 

willwin

Guest
Demiurg
чтобы анализировать лог. Есть запрос, который использует все четыре поля, присутствующих в индексе. Запрос этот очень часто тоже выполняется, и без индекса оооочень медленн, а с ним - быстро. Только вот с индексом вставка тормозит..
 

Demiurg

Guest
логи анализируются за прошедшие дни или за сегодня тоже ?
 

willwin

Guest
Demiurg
только за сегодняшний день. В 00.00 каждую ночь таблица очищается.
 

Апельсин

Оранжевое создание
willwin, если у вас идут только INSERT и никаких тебе UPDATE или DELETE, то имхо MyISAM будет оптимальнее.

Что касается времени для INSERT то используйте SHOW INNODB STATUS посмотреть есть ли какие локи и т.д.
 

Splurov

Новичок
willwin
varchar на int (ip2long)
time int(15) - это зачем? если у вас в пределах одного дня, то максимальное количество секунд будет 86400. и весь time хранить нет смысла.

-~{}~ 14.09.05 18:53:

Хотя это оптмизиации скорее для select'a а не для insert. Так что я оффтопю.
 

willwin

Guest
Splurov
спасибо, селект работает и так быстро :) Что до времени, то там не время, прошедшее с начала дня, а timestamp вставляется

Апельсин
DELETE один раз в сутки происходит. Попробуем MyISAM.
SHOW INNODB STATUS пока не могу, так как нет прав на это, а служба поддержки куда-то пропала.
 

Demiurg

Guest
вставляй данные в промежуточную таблицу, потом раз в какое то время вставляй их в основную таблицу.
 

Апельсин

Оранжевое создание
willwin, InnoDB хороша когда много разных (insert, update, delete, select) конкурентных запросов. А если у вас только INSERT и раз в сутки DELETE, который очищает таблицу (если он очищает всю таблицу, то его можно заменить на TRUNCATE) и вам не нужны прелести в виде транзакций и внешних ключей, то MyISAM скорее всего будет работать более эффективно. В общем проверить никто не мешает.
 
Сверху