scorpion-ds
Новичок
Есть таблица:
В гриде для построения постраничной навигации используется запрос с COUNT.
Недавно в БД были импортированны данные, в результате в таблице стало ~20 миллионов записей, после этого сайт по сути лег, так как не мог выполнять запросы с COUNT.
EXPLAIN показывал, что в качестве ключа он почему-то использует индекс "email_unique".
В качестве эксперемента, я создал еще один уникальный индекс по полю id и БД ожила:
Вопрос, разве PRIMARY нельзя использовать в качестве индекса?
P.S.: На проекте я недавно, он Yii и имеет много проблем, сейчас пробуем его заставить работать по нормальному.
Код:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`last_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`nickname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`avatar_path` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`status` tinyint(1) DEFAULT NULL,
`auth_key` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'auth_key',
`role` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'user',
`user_type` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Client',
`profile_status` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'new',
`completed_verified` tinyint(1) NOT NULL DEFAULT '0',
`is_indexable` tinyint(1) NOT NULL DEFAULT '1',
`user_version` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Live',
`register_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`singup_source` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Desktop',
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`password_reset_token` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`email_verification_token` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`new_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email_unique` (`email`),
UNIQUE KEY `Index 5` (`email_verification_token`),
KEY `profile_status_user_role` (`profile_status`,`role`),
KEY `slug` (`slug`)
) ENGINE=InnoDB AUTO_INCREMENT=25298949 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Недавно в БД были импортированны данные, в результате в таблице стало ~20 миллионов записей, после этого сайт по сути лег, так как не мог выполнять запросы с COUNT.
Код:
sql> SELECT COUNT(*) FROM users
[2018-11-15 11:50:40] 1 row retrieved starting from 1 in 1 m 29 s 806 ms (execution: 1 m 29 s 744 ms, fetching: 62 ms)
В качестве эксперемента, я создал еще один уникальный индекс по полю id и БД ожила:
Код:
sql> SELECT COUNT(*) FROM users USE INDEX (`PRIMARY`)
[2018-11-15 12:22:56] 1 row retrieved starting from 1 in 2 m 42 s 355 ms (execution: 2 m 42 s 333 ms, fetching: 22 ms)
sql> SELECT COUNT(*) FROM users USE INDEX (`id`)
[2018-11-15 12:23:32] 1 row retrieved starting from 1 in 3 s 434 ms (execution: 3 s 415 ms, fetching: 19 ms)
P.S.: На проекте я недавно, он Yii и имеет много проблем, сейчас пробуем его заставить работать по нормальному.