у меня есть эта таблица:очень медленно простой MySql запрос с индексом
CREATE TABLE `messenger_contacts` (
`number` varchar(15) NOT NULL,
`has_telegram` tinyint(1) NOT NULL DEFAULT '0',
`geo_state` int(11) NOT NULL DEFAULT '0',
`geo_city` int(11) NOT NULL DEFAULT '0',
`geo_postal` int(11) NOT NULL DEFAULT '0',
`operator` tinyint(1) NOT NULL DEFAULT '0',
`type` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `messenger_contacts`
ADD PRIMARY KEY (`number`),
ADD KEY `geo_city` (`geo_city`),
ADD KEY `geo_postal` (`geo_postal`),
ADD KEY `type` (`type`),
ADD KEY `type1` (`operator`),
ADD KEY `has_telegram` (`has_telegram`),
ADD KEY `geo_state` (`geo_state`);
около 11 миллионов записей.
Простой подсчет количества на этой таблице занимает от 30 до 60 секунд, чтобы завершить работу ведьмы, кажется очень высокой.
select count(number) from messenger_contacts where geo_state=1
Я не про базы данных так рядом настройки индексов я не знаю, что еще я могу сделать, чтобы сделать запрос быстрее?
UPDATE:
ОК, я сделал некоторые изменения типа и размера столбцов:
CREATE TABLE IF NOT EXISTS `messenger_contacts` (
`number` bigint(13) unsigned NOT NULL,
`has_telegram` tinyint(1) NOT NULL DEFAULT '0' ,
`geo_state` int(2) NOT NULL DEFAULT '0',
`geo_city` int(4) NOT NULL DEFAULT '0',
`geo_postal` int(10) NOT NULL DEFAULT '0',
`operator` tinyint(1) NOT NULL DEFAULT '0' ,
`type` tinyint(1) NOT NULL DEFAULT '0' ,
PRIMARY KEY (`number`),
KEY `has_telegram` (`has_telegram`,`geo_state`),
KEY `geo_city` (`geo_city`),
KEY `geo_postal` (`geo_postal`),
KEY `type` (`type`),
KEY `type1` (`operator`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Теперь запрос занимает всего 4 до 5 секунд с *
и number
Танки каждый один для ваша помощь, даже парень, который дал мне -1
. это было бы достаточно хорошо, если учесть, что мой сервер - это аппаратное обеспечение низкого уровня, и я буду кэшировать результаты select count
.
сколько своего рода состояние делает geo_state есть? и какой процент состояния = 1 во всех типах состояний? –
Каков результат 'explain extended select count (number) из messenger_contacts, где geo_state = 1'? Я бы добавил это к вашему вопросу, поскольку это одна из полезных вещей, помогающая отлаживать. –
Ошибка в вашем mysql: '\' type \ 'tinyint (1) NOT NULL DEFAULT '0'''. На линии есть двойные одинарные кавычки. – maxhb