這篇文章主要為大家展示了“SQL如何利用索引排序”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“SQL如何利用索引排序”這篇文章吧。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)麗水,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
近期在做數(shù)據(jù)庫的慢SQL優(yōu)化,從數(shù)據(jù)庫慢日志看到一個(gè)SQL執(zhí)行時(shí)間大概1.7s,高峰時(shí)候達(dá)到十幾秒
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)
執(zhí)行計(jì)劃:
使用了index,但是掃描行數(shù)為489300,說明索引效率不高。
查看表結(jié)構(gòu):
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 '服務(wù)序列號', `order_item_seq` varchar(40) COLLATE utf8_bin NOT NULL COMMENT '訂單項(xiàng)序列號', `status` varchar(2) COLLATE utf8_bin DEFAULT NULL COMMENT '服務(wù)狀態(tài): 00:新訂單 10:等待服務(wù) 20:取消處理 30:進(jìn)行中 40:在路上 50:到達(dá) 60:美甲師處理完成 90:用戶處理完成', `reserve_time` datetime DEFAULT NULL COMMENT '預(yù)約時(shí)間', `user_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客戶姓名', `user_contact` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '客戶聯(lián)系電話', `service_address_id` varchar(40) COLLATE utf8_bin DEFAULT NULL, `service_address` varchar(400) COLLATE utf8_bin DEFAULT NULL COMMENT '服務(wù)地址', `service_mode` tinyint(2) DEFAULT '0' COMMENT '服務(wù)類型:0:普通 1:班課', `policy_no` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '保單號', `insured_name` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '被保險(xiǎn)人姓名', `insured_identity` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '被保險(xiǎn)人身份證', `create_time` datetime NOT NULL COMMENT '建立時(shí)間', `update_time` datetime NOT NULL COMMENT '更新時(shí)間', `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 '經(jīng)度', `latitude` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '緯度', `refund_status` tinyint(2) DEFAULT '0' COMMENT '退款狀態(tài):0 無退款 2 待處理 3 退款請求失敗 4 退款請求成功 5 退款失敗 6 處理完成 8 退款成功', `settle_status` tinyint(2) DEFAULT '0' COMMENT '結(jié)算狀態(tài)', `comment_status` tinyint(2) DEFAULT '0' COMMENT '評論狀態(tài) 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 '服務(wù)時(shí)間類型\n:0 隨叫隨到\n 1 預(yù)約美甲 2 買約分離', `service_address_type` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '服務(wù)地址類型:home(顧客家), store(獨(dú)立手藝人自定義的門店), store_self(門店手藝人所屬門店), studio(原小聚點(diǎn))', `over_time` datetime DEFAULT NULL COMMENT '服務(wù)完成時(shí)間', `is_del` tinyint(1) DEFAULT '0' COMMENT '刪除標(biāo)記 0 未刪除 1 已刪除', `postpone_status` tinyint(2) DEFAULT '0' COMMENT '延期標(biāo)識:0 未過期 1 已過期 2 延期申請中 3 已延期 4 超期取消 5 拒絕延期', `last_overdue_time` datetime DEFAULT NULL COMMENT '最后過期時(shí)間', `source_from` int(3) DEFAULT NULL COMMENT '20代表套餐預(yù)約來的', `operator_id` varchar(40) COLLATE utf8_bin DEFAULT NULL COMMENT '具體執(zhí)行服務(wù)的手藝人的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='訂單服務(wù)項(xiàng)表' |
針對這個(gè)SQL,在status,reserve_time,is_del和id字段創(chuàng)建聯(lián)合索引,
alter table order_service_item add index idx_sta_rt_del_id (status,reserve_time,is_del,id);
查看執(zhí)行計(jì)劃:
執(zhí)行計(jì)劃走了新建的聯(lián)合索引,并且檢索行數(shù)變成了1行。
查看執(zhí)行時(shí)間:
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)
執(zhí)行時(shí)間已經(jīng)降到了ms級別。
以上是“SQL如何利用索引排序”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章名稱:SQL如何利用索引排序
分享網(wǎng)址:http://www.rwnh.cn/article0/ghdiio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、云服務(wù)器、移動網(wǎng)站建設(shè)、ChatGPT、網(wǎng)站收錄、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)