10條SQL優化技巧

一、一些常見的SQL實踐

(1)負向條件查詢不能使用索引

select * from order where status!=0 and stauts!=1

not in/not exists都不是好習慣

可以優化為in查詢:

select * from order where status in(2,3)

(2)前導模糊查詢不能使用索引

select * from order where desc like ‘%XX’

而非前導模糊查詢則可以:

select * from order where desc like ‘XX%’

(3)數據區分度不大的字段不宜使用索引

select * from user where sex=1

原因:性別只有男,女,每次過濾掉的數據很少,不宜使用索引。

經驗上,能過濾80%數據時就可以使用索引。對于訂單狀態,如果狀態值很少,不宜使用索引,如果狀態值很多,能夠過濾大量數據,則應該建立索引。

(4)在屬性上進行計算不能命中索引

select * from order where YEAR(date) < = ‘2017’

即使date上建立了索引,也會全表掃描,可優化為值計算:

select * from order where date < = CURDATE()

或者:

select * from order where date < = ‘2017-01-01’

二、并非周知的SQL實踐

(5)如果業務大部分是單條查詢,使用Hash索引性能更好,例如用戶中心

select * from user where uid=?

select * from user where login_name=?

原因:

B-Tree索引的時間復雜度是O(log(n))

Hash索引的時間復雜度是O(1)

(6)允許為null的列,查詢有潛在大坑

單列索引不存null值,復合索引不存全為null的值,如果列允許為null,可能會得到“不符合預期”的結果集

select * from user where name != ‘shenjian’

如果name允許為null,索引不存儲null值,結果集中不會包含這些記錄。

所以,請使用not null約束以及默認值。

(7)復合索引最左前綴,并不是值SQL語句的where順序要和復合索引一致

用戶中心建立了(login_name, passwd)的復合索引

select * from user where login_name=? and passwd=?

select * from user where passwd=? and login_name=?

都能夠命中索引

select * from user where login_name=?

也能命中索引,滿足復合索引最左前綴

select * from user where passwd=?

不能命中索引,不滿足復合索引最左前綴

(8)使用ENUM而不是字符串

ENUM保存的是TINYINT,別在枚舉中搞一些“中國”“北京”“技術部”這樣的字符串,字符串空間又大,效率又低。

三、小眾但有用的SQL實踐

(9)如果明確知道只有一條結果返回,limit 1能夠提高效率

select * from user where login_name=?

可以優化為:

select * from user where login_name=? limit 1

原因:

你知道只有一條結果,但數據庫并不知道,明確告訴它,讓它主動停止游標移動

(10)把計算放到業務層而不是數據庫層,除了節省數據的CPU,還有意想不到的查詢緩存優化效果

select * from order where date < = CURDATE()

這不是一個好的SQL實踐,應該優化為:

$curDate = date(‘Y-m-d’);

$res = mysql_query(

'select * from order where date < = $curDate');
  • 1

原因:

釋放了數據庫的CPU

多次調用,傳入的SQL相同,才可以利用查詢緩存

(11)強制類型轉換會全表掃描

select * from user where phone=13800001234

你以為會命中phone索引么?大錯特錯了,這個語句究竟要怎么改?

末了,再加一條,不要使用select *(潛臺詞,文章的SQL都不合格 =_=),只返回需要的列,能夠大大的節省數據傳輸量,與數據庫的內存使用量喲。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41962.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Codeforces Round 893 (Div. 2)B題題解

文章目錄 [The Walkway](https://codeforces.com/contest/1858/problem/B)問題建模問題分析1.分析所求2.如何快速計算每個商販被去除后的餅干數量代碼 The Walkway 問題建模 給定n個椅子&#xff0c;其中有m個位置存在商販&#xff0c;在商販處必須購買餅干吃&#xff0c;每隔…

Python程序設計——字符串處理的特殊方法

學習目標&#xff1a; 學習如何創建字符串使用len、min和max函數獲取一個字符串的長度、串中的最大和最小的字符使用下標運算符([])訪問字符串中的元素使用截取運算符str[ start:end]從較長的字符串中得到一個子串使用運算符連接兩個字符串&#xff0c;通過*運算符復制一個字符…

【Odroid C4】交叉編譯工具鏈安裝以及QT交叉編譯環境搭建

【Odroid C4】交叉編譯工具鏈安裝以及QT交叉編譯環境搭建 虛擬機環境&#xff0c;UBUNTU20.04 文章目錄 【Odroid C4】交叉編譯工具鏈安裝以及QT交叉編譯環境搭建一、Odroid C4交叉編譯工具鏈安裝二、QT下載及編譯安裝1.QT下載2.交叉編譯QT 配置QtCreator可以[參考](https://bl…

快速入門vue3新特性和新的狀態管理庫pinia

(創作不易&#xff0c;感謝有你&#xff0c;你的支持&#xff0c;就是我前行的最大動力&#xff0c;如果看完對你有幫助&#xff0c;請留下您的足跡&#xff09; 目錄 Vue3.3新特性 defineOptions defineModel pinia 介紹 與 Vuex 3.x/4.x 的比較 安裝 核心概念 定義…

前饋神經網絡多分類任務

pytorch深度學習的套路都差不多&#xff0c;多看多想多寫多測試&#xff0c;自然就會了。主要的技術還是在于背后的數學思想和數學邏輯。 廢話不多說&#xff0c;上代碼自己看。 import torch import numpy as np import torch.nn as nn import torchvision import torchvisi…

【騰訊云Cloud Studio實戰訓練營】使用Cloud Studio社區版快速構建React完成點餐H5頁面還原

陳老老老板&#x1f9b8; &#x1f468;?&#x1f4bb;本文專欄&#xff1a;生活&#xff08;主要講一下自己生活相關的內容&#xff09; &#x1f468;?&#x1f4bb;本文簡述&#xff1a;生活就像海洋,只有意志堅強的人,才能到達彼岸。 &#x1f468;?&#x1f4bb;上一篇…

成集云 | 用友U8采購請購單同步釘釘 | 解決方案

源系統成集云目標系統 方案介紹 用友U8是中國用友集團開發和推出的一款企業級管理軟件產品。具有豐富的功能模塊&#xff0c;包括財務管理、采購管理、銷售管理、庫存管理、生產管理、人力資源管理、客戶關系管理等&#xff0c;可根據企業的需求選擇相應的模塊進行集…

什么是原子交換?

安全地在各個區塊鏈網絡之間傳輸資產對于釋放被困流動性并吸引更多用戶進入這一領域至關重要&#xff0c;同時也保持 Web3 的信任最小化核心價值。原子交換是一種讓兩個人在不依賴于中介來促成交易的情況下&#xff0c;在不同的區塊鏈網絡之間交換通證資產的方式。這為 DeFi 用…

Linux硬鏈接和軟連接

1、硬鏈接 硬連接指通過索引節點來進行連接。在 Linux 的文件系統中&#xff0c;保存在磁盤分區中的文件不管是什么類型都給它分配一個編號&#xff0c;稱為索引節點號(Inode Index)。在 Linux 中&#xff0c;多個文件名指向同一索引節點是存在的。比如&#xff1a;A 是 B 的硬…

數據結構之隊列詳解(包含例題)

一、隊列的概念 隊列是一種特殊的線性表&#xff0c;特殊之處在于它只允許在表的前端&#xff08;front&#xff09;進行刪除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;進行插入操作&#xff0c;和棧一樣&#xff0c;隊列是一種操作受限制的線性表。進行插入操…

【Windows 常用工具系列 5 -- Selenium IDE的使用方法 】

文章目錄 Selenium 介紹Selenium IDE 介紹 Selenium IDE安裝Chrome 瀏覽器安裝Selenium IDE使用 Selenium 介紹 Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作一樣。 Selenium家庭成員有三個&#xff0c;分別是S…

Ubuntu 20.04 與 ROS noetic安裝 gtsam 編譯 LIO-SAM 的適配版本

Ubuntu 20.04 基于 ROS noetic安裝 gtsam&#xff0c; 編譯 LIO-SAM 的適配版本 摘要安裝GTSAM(ros-noetic-gtsam版本)編譯LIO-SAM的適配版本 摘要 本文簡介在 Ubuntu 20.04 下以 ROS noetic 為基礎安裝 GTSAM 并成功編譯 LIO-SAM 的適配版本。 安裝GTSAM(ros-noetic-gtsam版…

騰訊云國際站代充-阿里云ECS怎么一鍵遷移到騰訊云cvm?

今天主要來介紹一下如何通過阿里云國際ECS控制臺一鍵遷移至騰訊云國際CVM。騰訊云國際站云服務器CVM提供全面廣泛的服務內容。無-需-綁-定PayPal&#xff0c;代-充-值騰訊云國際站、阿里云國際站、AWS亞馬遜云、GCP谷歌云&#xff0c;官方授權經銷商&#xff01;靠譜&#xff0…

視頻匯聚集中存儲EasyCVR平臺調用iframe地址視頻無法播放,該如何解決?

安防監控視頻匯聚平臺EasyCVR基于云邊端一體化架構&#xff0c;具有強大的數據接入、處理及分發能力&#xff0c;可提供視頻監控直播、云端錄像、視頻云存儲、視頻集中存儲、視頻存儲磁盤陣列、錄像檢索與回看、智能告警、平臺級聯、云臺控制、語音對講、AI算法中臺智能分析無縫…

【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口

1. ApplicationRunner接口 用法&#xff1a; 類型&#xff1a; 接口 方法&#xff1a; 只定義了一個run方法 使用場景&#xff1a; springBoot項目啟動時&#xff0c;若想在啟動之后直接執行某一段代碼&#xff0c;就可以用 ApplicationRunner這個接口&#xff0c;并實現接口…

vue3+elementUI-plus實現select下拉框的虛擬滾動

網上查了幾個方案&#xff0c;要不就是不兼容&#xff0c;要不就是不支持vue3, 最終找到一個合適的&#xff0c;并且已上線使用&#xff0c;需要修改一下樣式&#xff1a; 代碼如下&#xff1a; main.js里引用 import vue3-virtual-scroller/dist/vue3-virtual-scroller.css; …

xollam勒索病毒數據恢復|金蝶、用友、管家婆、OA、速達、ERP等軟件數據庫恢復

引言&#xff1a; 數字時代的繁榮與便捷&#xff0c;也孕育著各種網絡安全威脅。其中&#xff0c;.xollam勒索病毒以其毒害性和隱蔽性引發了廣泛關注。本文91數據恢復將為您深入解析.xollam勒索病毒的威脅&#xff0c;探討解密方法&#xff0c;同時分享預防.xollam勒索病毒的關…

Python入門教程23:math模塊的用法

**math是Python 的一個內置模塊&#xff0c;它提供了許多數學函數和常量&#xff0c;用于進行數學計算。**以下是一些常用的math模塊中的函數和常量&#xff1a; math.pi&#xff1a;圓周率π的近似值&#xff0c;約等于3.14159。 math.e&#xff1a;自然對數的底數e的近似值…

【Tomcat】(Tomcat 下載Tomcat 啟動Tomcat 簡單部署 基于Tomcat進行網站后端開發)

文章目錄 Tomcat下載Tomcat啟動Tomcat簡單部署 基于Tomcat進行網站后端開發 Tomcat Tomcat 是一個 HTTP 服務器.HTTP 協議就是 HTTP 客戶端和 HTTP 服務器之間的交互數據的格式. HTTP 服務器我們可以通過 Java Socket 來實現. 而 Tomcat 就是基于 Java 實現的一個開源免費,也是…

Python爬蟲:如何使用Python爬取網站數據

更新&#xff1a;2023-08-13 15:30 想要獲取網站的數據&#xff1f;使用Python爬蟲是一個絕佳的選擇。Python爬蟲是通過自動化程序來提取互聯網上的信息。本文章將會詳細介紹Python爬蟲的相關技術。 一、網絡協議和請求 在使用Python爬蟲之前&#xff0c;我們需要理解網絡協…