SQL如何利用索引排序
这篇文章主要为大家展示了“SQL如何利用索引排序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL如何利用索引排序”这篇文章吧。
近期在做数据库的慢SQL优化,从数据库慢日志看到一个SQL执行时间大概1.7s,高峰时候达到十几秒
mysql>SELECTid,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->FROMorder_service_item->WHEREstatus='10'->ANDreserve_timeBETWEEN'2019-07-1006:00:00.085'AND'2019-07-1006:10:00.085'->ANDis_del=0->ORDERBYidDESC;Emptyset(1.77sec)
执行计划:
使用了index,但是扫描行数为489300,说明索引效率不高。
查看表结构:
showcreatetableorder_service_item;|order_service_item|CREATETABLE`order_service_item`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键ID',`service_seq`varchar(40)COLLATEutf8_binNOTNULLCOMMENT'服务序列号',`order_item_seq`varchar(40)COLLATEutf8_binNOTNULLCOMMENT'订单项序列号',`status`varchar(2)COLLATEutf8_binDEFAULTNULLCOMMENT'服务状态:00:新订单10:等待服务20:取消处理30:进行中40:在路上50:到达60:美甲师处理完成90:用户处理完成',`reserve_time`datetimeDEFAULTNULLCOMMENT'预约时间',`user_name`varchar(40)CHARACTERSETutf8mb4COLLATEutf8mb4_binDEFAULTNULLCOMMENT'客户姓名',`user_contact`varchar(20)COLLATEutf8_binDEFAULTNULLCOMMENT'客户联系电话',`service_address_id`varchar(40)COLLATEutf8_binDEFAULTNULL,`service_address`varchar(400)COLLATEutf8_binDEFAULTNULLCOMMENT'服务地址',`service_mode`tinyint(2)DEFAULT'0'COMMENT'服务类型:0:普通1:班课',`policy_no`varchar(20)COLLATEutf8_binDEFAULTNULLCOMMENT'保单号',`insured_name`varchar(20)COLLATEutf8_binDEFAULTNULLCOMMENT'被保险人姓名',`insured_identity`varchar(20)COLLATEutf8_binDEFAULTNULLCOMMENT'被保险人身份证',`create_time`datetimeNOTNULLCOMMENT'建立时间',`update_time`datetimeNOTNULLCOMMENT'更新时间',`artisan_id`varchar(40)COLLATEutf8_binDEFAULTNULLCOMMENT'手艺人ID',`product_id`varchar(40)COLLATEutf8_binDEFAULTNULLCOMMENT'作品ID',`user_id`varchar(40)COLLATEutf8_binDEFAULTNULLCOMMENT'客户ID',`longitude`varchar(20)COLLATEutf8_binDEFAULTNULLCOMMENT'经度',`latitude`varchar(20)COLLATEutf8_binDEFAULTNULLCOMMENT'纬度',`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)COLLATEutf8_binDEFAULTNULLCOMMENT'备注',`last_update_time`datetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,`order_time_type`tinyint(4)DEFAULTNULLCOMMENT'服务时间类型\n:0随叫随到\n1预约美甲2买约分离',`service_address_type`varchar(20)COLLATEutf8_binDEFAULTNULLCOMMENT'服务地址类型:home(顾客家),store(独立手艺人自定义的门店),store_self(门店手艺人所属门店),studio(原小聚点)',`over_time`datetimeDEFAULTNULLCOMMENT'服务完成时间',`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`datetimeDEFAULTNULLCOMMENT'最后过期时间',`source_from`int(3)DEFAULTNULLCOMMENT'20代表套餐预约来的',`operator_id`varchar(40)COLLATEutf8_binDEFAULTNULLCOMMENT'具体执行服务的手艺人的ID',`verificat_code`varchar(20)COLLATEutf8_binDEFAULT''COMMENT'天猫核销码',PRIMARYKEY(`id`),UNIQUEKEY`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=InnoDBAUTO_INCREMENT=11593152DEFAULTCHARSET=utf8COLLATE=utf8_binROW_FORMAT=DYNAMICCOMMENT='订单服务项表'|
针对这个SQL,在status,reserve_time,is_del和id字段创建联合索引,
altertableorder_service_itemaddindexidx_sta_rt_del_id(status,reserve_time,is_del,id);
查看执行计划:
执行计划走了新建的联合索引,并且检索行数变成了1行。
查看执行时间:
mysql>SELECTid,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->FROMorder_service_item->WHEREstatus='10'->ANDreserve_timeBETWEEN'2019-07-1006:00:00.085'AND'2019-07-1006:10:00.085'->ANDis_del=0->ORDERBYidDESC;Emptyset(0.00sec)
执行时间已经降到了ms级别。
以上是“SQL如何利用索引排序”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。