SQL如何利用索引排序
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要为大家展示了"SQL如何利用索引排序",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SQL如何利用索引排序"这篇文章吧。近期在做数据库的慢SQL
千家信息网最后更新 2025年01月20日SQL如何利用索引排序
这篇文章主要为大家展示了"SQL如何利用索引排序",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SQL如何利用索引排序"这篇文章吧。
近期在做数据库的慢SQL优化,从数据库慢日志看到一个SQL执行时间大概1.7s,高峰时候达到十几秒
mysql> SELECT id, service_seq, order_item_seq, status, order_time_type -> , reserve_time, user_name, user_contact, service_address_type, service_address_id -> , service_address, service_mode, insured_name, insured_identity, policy_no -> , create_time, update_time, over_time, artisan_id, product_id -> , user_id, longitude, latitude, refund_status, settle_status -> , comment_status, remark, insured_name, insured_identity, is_del -> , postpone_status, last_overdue_time, source_from, operator_id -> FROM order_service_item -> WHERE status = '10' -> AND reserve_time BETWEEN '2019-07-10 06:00:00.085' AND '2019-07-10 06:10:00.085' -> AND is_del = 0 -> ORDER BY id DESC;Empty set (1.77 sec)
执行计划:
使用了index,但是扫描行数为489300,说明索引效率不高。
查看表结构:
show create table order_service_item;| order_service_item | CREATE TABLE `order_service_item` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `service_seq` varchar(40) COLLATE utf8_bin NOT NULL COMMENT '服务序列号', `order_item_seq` varchar(40) COLLATE utf8_bin NOT NULL COMMENT '订单项序列号', `status` varchar(2) COLLATE utf8_bin DEFAULT NULL COMMENT '服务状态: 00:新订单 10:等待服务 20:取消处理 30:进行中 40:在路上 50:到达 60:美甲师处理完成 90:用户处理完成', `reserve_time` datetime DEFAULT NULL COMMENT '预约时间', `user_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客户姓名', `user_contact` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '客户联系电话', `service_address_id` varchar(40) COLLATE utf8_bin DEFAULT NULL, `service_address` varchar(400) COLLATE utf8_bin DEFAULT NULL COMMENT '服务地址', `service_mode` tinyint(2) DEFAULT '0' COMMENT '服务类型:0:普通 1:班课', `policy_no` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '保单号', `insured_name` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '被保险人姓名', `insured_identity` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '被保险人身份证', `create_time` datetime NOT NULL COMMENT '建立时间', `update_time` datetime NOT NULL COMMENT '更新时间', `artisan_id` varchar(40) COLLATE utf8_bin DEFAULT NULL COMMENT '手艺人ID', `product_id` varchar(40) COLLATE utf8_bin DEFAULT NULL COMMENT '作品ID', `user_id` varchar(40) COLLATE utf8_bin DEFAULT NULL COMMENT '客户ID', `longitude` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '经度', `latitude` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '纬度', `refund_status` tinyint(2) DEFAULT '0' COMMENT '退款状态:0 无退款 2 待处理 3 退款请求失败 4 退款请求成功 5 退款失败 6 处理完成 8 退款成功', `settle_status` tinyint(2) DEFAULT '0' COMMENT '结算状态', `comment_status` tinyint(2) DEFAULT '0' COMMENT '评论状态 0 未评论 1 已评论', `remark` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '备注', `last_update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `order_time_type` tinyint(4) DEFAULT NULL COMMENT '服务时间类型\n:0 随叫随到\n 1 预约美甲 2 买约分离', `service_address_type` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '服务地址类型:home(顾客家), store(独立手艺人自定义的门店), store_self(门店手艺人所属门店), studio(原小聚点)', `over_time` datetime DEFAULT NULL COMMENT '服务完成时间', `is_del` tinyint(1) DEFAULT '0' COMMENT '删除标记 0 未删除 1 已删除', `postpone_status` tinyint(2) DEFAULT '0' COMMENT '延期标识:0 未过期 1 已过期 2 延期申请中 3 已延期 4 超期取消 5 拒绝延期', `last_overdue_time` datetime DEFAULT NULL COMMENT '最后过期时间', `source_from` int(3) DEFAULT NULL COMMENT '20代表套餐预约来的', `operator_id` varchar(40) COLLATE utf8_bin DEFAULT NULL COMMENT '具体执行服务的手艺人的ID', `verificat_code` varchar(20) COLLATE utf8_bin DEFAULT '' COMMENT '天猫核销码', PRIMARY KEY (`id`), UNIQUE KEY `index_service_seq` (`service_seq`), KEY `index_order_item_seq` (`order_item_seq`), KEY `index_user_id` (`user_id`), KEY `index_artisan_id` (`artisan_id`), KEY `index_status` (`status`), KEY `index_product_id` (`product_id`), KEY `idx_last_update_time` (`last_update_time`), KEY `idx_comment_status` (`comment_status`,`status`)) ENGINE=InnoDB AUTO_INCREMENT=11593152 DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC COMMENT='订单服务项表' |
针对这个SQL,在status,reserve_time,is_del和id字段创建联合索引,
alter table order_service_item add index idx_sta_rt_del_id (status,reserve_time,is_del,id);
查看执行计划:
执行计划走了新建的联合索引,并且检索行数变成了1行。
查看执行时间:
mysql> SELECT id, service_seq, order_item_seq, status, order_time_type -> , reserve_time, user_name, user_contact, service_address_type, service_address_id -> , service_address, service_mode, insured_name, insured_identity, policy_no -> , create_time, update_time, over_time, artisan_id, product_id -> , user_id, longitude, latitude, refund_status, settle_status -> , comment_status, remark, insured_name, insured_identity, is_del -> , postpone_status, last_overdue_time, source_from, operator_id -> FROM order_service_item -> WHERE status = '10' -> AND reserve_time BETWEEN '2019-07-10 06:00:00.085' AND '2019-07-10 06:10:00.085' -> AND is_del = 0 -> ORDER BY id DESC;Empty set (0.00 sec)
执行时间已经降到了ms级别。
以上是"SQL如何利用索引排序"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
服务
时间
索引
处理
手艺
手艺人
状态
排序
内容
客户
篇文章
类型
门店
评论
成功
地址
姓名
序列
序列号
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
文鳐互联网科技招聘信息
两个 sqlite 数据库
长宁区会计网络技术备案
盒马网络技术有限公司 地址
养狗软件开发
命令行建立数据库
数据库字段属性有哪些
云课堂可以改服务器吗
电脑端的软件开发
软件开发概要设计谁提供
泰拉瑞亚哪里看服务器ip
服务器fc
华硕软件开发笔记本电脑配置
负责网络安全工作的部门
体供给金融信息数据库会坐牢吗
软件开发平台最好的
服务器网卡报价
sql类型数据库
5g网络技术对未来的影响
数据库相关的法律法规
软件开发技术员工资组成
华为云有自己的服务器吗
cs魔兽服务器
漳州软件开发 笃行
绝地求生这么选服务器
福建智能视频分析服务器虚拟主机
从事网络技术工作的男人
中卫科技型网站服务器
西安交易性数据库
内网服务器全局代理