我该如何优化这个句SQL??

有一张快递单号表number,表中有大概5w条数据
每次要使用时取出一条出来,语句如下

SELECT id FROM number WHERE status = 0

status 默认为0待使用 ,1使用中,2已使用
但是每次执行时间超长,大概7秒左右,已给 status 建了索引,但是效果不佳

Explain结果

image.png


更新内容 表结构

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;
阅读 3k
5 个回答

SELECT id FROM number WHERE status = 0 limit 1,让你的sql快到飞起

你这个 status 如果就这三种状态、且每种的数量差不多,那就没必要建索引了,对查询性能提升微乎其微、反倒拖累插入和更新时的性能。

另外你这个 7 秒左右你看 profiling 了吗?时间是耗在哪一步的?贴结果上来看看。如果主要耗时是在这 5W 条记录的网络传输上,那就不是优化 SQL 的问题了,你需要的是带宽。

把你表结构贴出来。
还有 explain 的信息截取完整。
在看看 status=0 的数据是不是有2 万多条。
你取一条的话,可以加 limit 1

选择建立索引字段的条件之一是: 尽量找字段值变化多的, 你 status 字段总共就 3 个值,其建立不建立索引意义不是特别大,而且才5w数据量。

你执行慢,应该看看一下执行计划,给个表结构出来看看

你 status 字段的类型是不是 char ? 你查询的时候用的是数字 0 ,这样的话会有内部的转化,会比较慢

explain 下,看下执行计划,才5万条数据,不至于这么慢的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题