我该如何优化这个句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

回到顶部