我该如何优化这个句SQL??
有一张快递单号表number
,表中有大概5w条数据
每次要使用时取出一条出来,语句如下
SELECT id FROM number WHERE status = 0
status 默认为0待使用 ,1使用中,2已使用
但是每次执行时间超长,大概7秒左右,已给 status 建了索引,但是效果不佳
Explain结果
更新内容 表结构
CREATE TABLE `number` (`id` int(11) NOT NULL,
`number` varchar(32) NOT NULL,
`number_code` varchar(64) NOT NULL,
`order_id` int(11) DEFAULT NULL,
`oid` varchar(32) DEFAULT NULL,
`src` varchar(128) NOT NULL,
`added_user_id` int(11) NOT NULL,
`added_user_name` varchar(32) NOT NULL,
`added_date` datetime NOT NULL COMMENT '添加时间',
`added_ip` varchar(16) NOT NULL COMMENT '添加时的IP',
`updated_user_id` int(11) DEFAULT NULL COMMENT '更新人id',
`updated_user_name` varchar(32) DEFAULT NULL,
`updated_date` datetime DEFAULT NULL,
`updated_ip` varchar(16) DEFAULT NULL,
`push_json` text,
`push_date` datetime DEFAULT NULL,
`return_json` text,
`return_retstatus` varchar(256) DEFAULT NULL,
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'status 默认为0待使用 ,1使用中,2已使用'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `number`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `oid` (`oid`),
ADD UNIQUE KEY `order_id` (`order_id`),
ADD KEY `order_id_2` (`order_id`),
ADD KEY `status` (`status`);
ALTER TABLE `number`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;
回答
你这个 status
如果就这三种状态、且每种的数量差不多,那就没必要建索引了,对查询性能提升微乎其微、反倒拖累插入和更新时的性能。
另外你这个 7 秒左右你看 profiling 了吗?时间是耗在哪一步的?贴结果上来看看。如果主要耗时是在这 5W 条记录的网络传输上,那就不是优化 SQL 的问题了,你需要的是带宽。
把你表结构贴出来。
还有 explain 的信息截取完整。
在看看 status=0 的数据是不是有2 万多条。
你取一条的话,可以加 limit 1
选择建立索引字段的条件之一是: 尽量找字段值变化多的, 你 status 字段总共就 3 个值,其建立不建立索引意义不是特别大,而且才5w数据量。
你执行慢,应该看看一下执行计划,给个表结构出来看看
你 status 字段的类型是不是 char ? 你查询的时候用的是数字 0 ,这样的话会有内部的转化,会比较慢
SELECT id FROM number WHERE status = 0 limit 1
,让你的sql快到飞起
explain 下,看下执行计划,才5万条数据,不至于这么慢的
以上是 我该如何优化这个句SQL?? 的全部内容, 来源链接: utcz.com/a/39471.html