Я не очень привык к MySQL, но я думаю, что это может быть намного быстрее, чем есть.Как оптимизировать запрос при группировке по метке даты/времени unix?
Вот мой стол:
CREATE TABLE `crashes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`added_date` int(11) NOT NULL,
`status` int(11) NOT NULL,
`issue_id` varchar(32) NOT NULL,
`report_id` text NOT NULL,
`app_version_code` text NOT NULL,
`app_version_name` text NOT NULL,
`package_name` varchar(80) NOT NULL,
`package_name_id` tinyint(4) NOT NULL,
`file_path` text NOT NULL,
`phone_model` text NOT NULL,
`android_version` text NOT NULL,
`build` text NOT NULL,
`brand` text NOT NULL,
`product` text NOT NULL,
`total_mem_size` int(11) NOT NULL,
`available_mem_size` int(11) NOT NULL,
`custom_data` text NOT NULL,
`stack_trace` text NOT NULL,
`initial_configuration` text NOT NULL,
`crash_configuration` text NOT NULL,
`display` text NOT NULL,
`user_comment` text NOT NULL,
`user_app_start_date` text NOT NULL,
`user_crash_date` text NOT NULL,
`dumpsys_meminfo` text NOT NULL,
`dropbox` text NOT NULL,
`logcat` text NOT NULL,
`eventslog` text NOT NULL,
`radiolog` text NOT NULL,
`is_silent` text NOT NULL,
`device_id` text NOT NULL,
`installation_id` text NOT NULL,
`user_email` text NOT NULL,
`device_features` text NOT NULL,
`environment` text NOT NULL,
`settings_system` text NOT NULL,
`settings_secure` text NOT NULL,
`shared_preferences` text NOT NULL,
`application_log` text NOT NULL,
`media_codec_list` text NOT NULL,
`thread_details` text NOT NULL,
`user_ip` text NOT NULL,
PRIMARY KEY (`id`),
KEY `package_name_id` (`package_name_id`)
) ENGINE=MyISAM AUTO_INCREMENT=202364 DEFAULT CHARSET=utf8
Как вы можете видеть, он заполнен 200k строк. Я хотел бы получить строку added_date
(unix timestamp, int(11)
) и количество строк в этот день.
Так я выбираю дату, день (как Y-M-D), и посчитайте:
SELECT date_format(from_unixtime(added_date), '%Y-%c-%d') as date, added_date, count(*) as nb_crashes FROM crashes WHERE package_name = 'net.bicou.redmine' GROUP BY date ORDER BY date ASC
Это очень медленно! Почти 1,5 секунды на выделенном сервере mysql на моем хосте.
Поэтому я полагал, что я мог бы оптимизировать вещь, немного: я добавил package_name_id, который является tinyint
, который является уникальным для каждого package_name
(у меня есть 5 различных package_name
значения на что 200k строк). Я сделал это INDEX
, чтобы MySQL мог быстрее его просматривать.
Результат: 0.9sec. Это намного лучше, но я все равно не ожидаю!
Как я могу оптимизировать предмет? Я думаю, что создание даты в каждой строке, тогда группировка очень дорогая. Однако я не знаю, как я мог бы сделать это быстрее ...
Edit:
Вот что я сделал, чтобы обновить таблицу:
ALTER TABLE `crashes` ADD `temp` DATETIME NOT NULL
UPDATE crashes SET temp = FROM_UNIXTIME(added_date)
ALTER TABLE `crashes` ADD INDEX ( `temp`)
Вот обновленный запрос:
SELECT added_date, count(*) as nb_crashes FROM crashes WHERE package_name_id=3 GROUP BY year(temp),month (temp),dayofmonth(temp) ORDER BY temp ASC
У меня все еще есть время выполнения около одной секунды ... Я сделал что-то не так?
Большое спасибо. Я грязный разработчик php, который учился как любитель 10 лет назад, я только начал снова. Я сделаю все правильно, спасибо за подсказки. –
Эй, я обновил свой вопрос, потому что я все еще не могу оптимизировать таблицу так, как хочу. Об этих «текстовых» полях они не используются в выборе, объединении или группе, поэтому я решил, что это не имеет значения. –