【发布时间】:2016-06-29 04:31:03
【问题描述】:
我有这张桌子:
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`);
大约有 1100 万条记录。
在这张表上进行简单的计数选择大约需要 30 到 60 秒才能完成女巫似乎非常高。
select count(number) from messenger_contacts where geo_state=1
我不是数据库专家,所以除了设置索引之外,我不知道我还能做些什么来加快查询速度?
更新:
好的,我对列类型和大小进行了一些更改:
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;
现在* 和number 的查询只需 4 到 5 秒
感谢每一个人的帮助,即使是给我-1的那个人。考虑到我的服务器是低端硬件并且我将缓存select count 结果,这已经足够了。
【问题讨论】:
-
geo_state 有几种状态?在各种状态中,状态 =1 的百分比是多少?
-
explain extended select count(number) from messenger_contacts where geo_state=1的输出是什么?我会将其添加到您问题的底部,因为这是帮助调试的一件有用的事情。 -
你的 mysql 中的错误:
`type` tinyint(1) NOT NULL DEFAULT '0''。行首有双单引号。 -
@maxhb 拼写错误,已修复
-
COUNT(*)有什么不同吗?
标签: mysql sql performance indexing