MySQL查詢優化方案彙總(索引相關)

来源:https://www.cnblogs.com/phpphp/p/18060671
-Advertisement-
Play Games

索引相關 類型隱式轉換 大坑 **欄位filed1是varchar類型,且加了索引,如果 where filed1 = 123; type 可能是all,因為123是數字類型,mysql內部會用函數做隱式轉換,用了函數,索引就失效了。** 大數據深度分頁,用主鍵 select field1,fiel ...


索引相關

類型隱式轉換 大坑

**欄位filed1是varchar類型,且加了索引,如果 where filed1 = 123; type 可能是all,因為123是數字類型,mysql內部會用函數做隱式轉換,用了函數,索引就失效了。**

大數據深度分頁,用主鍵

select field1,field2 from table limit 100000,10;
select field1,field2 from table where id > 100000 limit 10;

避免使用MySQL函數

MySQL內置了很多函數,使用函數可能導致索引失效,儘量讓MySQL只做簡單的增刪改查。

避免類型的隱式轉換

varchar等字元串類型的欄位被加了索引,把這欄位當做where條件,及時目標值是數字,也要加引號,否則類型的隱式轉換,會引起索引失效的問題。

避免使用函數或表達式,儘量只讓資料庫做純粹的增刪改查。

用函數的前提是知道初始值,然後在操作數據,很多函數都是要傳參的,所以mysql只能全表查,然後每次迭代將數據丟給函數處理。
表達式也是如此,例如where number + 1 = 10,都會讓索引失效。

避免使用不等值做排除法

避免使用<>、!=、not in、is not null、這些都會使索引失效。

避免使用null值

避免欄位使用null值,一是影響索引(mysql建索引建的是非null的值,大量的null值影響了正常的B+tree結構),而且造成聚合函數統計(如count(該欄位))不准確的問題。

索引無關

減少大欄位查詢,避免使用*,不說磁碟io的損耗,連網路帶寬都跟著損耗。
如果只select僅需欄位,可能會觸發覆蓋索引機制,不用回表,提高性能。

select * from table;
select field1,field2 from table;

查詢是否存在

select count(*) from table where...;
select field from table where ... limit 1;

冗餘優化

想要查詢一篇文章的瀏覽量,不用count(瀏覽記錄)。
新建一個在文章表中建立一個瀏覽量的欄位,這使得查詢的時間複雜度從O(n)變成O(1);

避免join,適用於大表關聯小表。

如果想要join的兩個表,一個很大,一個很小,應儘量避免join。
可將小表數據全部取出來組裝成數組,放入編程語言的記憶體,用編程語言的記憶體匹配的方式去關聯。

哪些場景下索引會失效

  • 使用not in、is not null、<>、!=、這種排除法時會導致索引失效,覆蓋索引除外。
  • 最左匹配原則,左邊的欄位缺少時會出現,覆蓋索引除外。
  • 最左匹配原則,左邊的欄位有區間查詢,導致右邊的欄位無法使用索引。
  • like左邊或兩邊加百分號。
  • 類型的隱式轉換,如varchar的欄位,使用where varchar_field = 123,包括join表,用on連接的欄位。
  • where條件有函數,或表達式。
  • where語句包含or,or中存在非索引列。
  • 大數據量對二級索引欄位排序,如果select * 或者其它欄位,這個過程涉及回表,可能無法使用索引,因為數據量大,走索引的每條數據都需要回表,代價會很大。
  • order by欄位,如果排序與索引順序不一致,則可能導致索引失效,如果order by的每個欄位,都按照索引的順序,或者反順序,則仍舊會走索引。

那些查詢適合創建索引?

  • 需要唯一性約束兜底的欄位。
  • 經常被查詢或者作為where條件的欄位,=、>、<、<=、>=、in、between、like 右百分號。
  • 經常group by或者order by的欄位。
  • delete或update被作為where條件的欄位。
  • distinct的欄位。
  • join on的連接欄位需要加索引,但是需要類型一致,因為MySQL內部有用函數做隱式轉換,用了函數就不適用索引。
  • 區分度(不重覆度)高的欄位。
  • 把搜索最頻繁的列,放在聯合索引的左側,(受聯合索引的最左原則影響)。

那些查詢不適合創建索引?

  • 數據量小,一個表,例如配置表,總類別表,可能最多幾十條記錄,創建不創建區別不大。
  • 寫多讀少,數據的寫操作對索引欄位的開銷比沒有索引要大,而且讀操作還少。
  • 區分度低的欄位,例如性別狀態等,這會導致線性查找,能提升搜索效率,但是不明顯,可加可不加。
  • sql語句包含<>、!=、not in、is not null,無法使用索引,所以專門用作排除性查找的,不建議創建索引。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查詢 語法: SELECT 標識選擇哪些列 FROM 標識從哪個表中選擇 去重(Distinct) 在SELECT語句中使用關鍵字DISTINCT去除重覆行 SELECT DISTINCT department_id FROM employees; 過濾(Where) 語法: SELECT 欄位1, ...
  • 本文說明的是MySQL鎖,和操作系統或者編程語言的鎖無關。 概念 作用:在併發情況下讓數據正確的讀寫。 優點:併發情況下對數據讀寫可控,防止出錯。 缺點:降低性能、增加難度。 分類 數據操作類型劃分 讀鎖(共用鎖、S鎖) 寫鎖(排它鎖、獨占鎖、X鎖) 粒度劃分 表級鎖 S鎖、X鎖 意向鎖 自增鎖 元 ...
  • 聲明測試表,供文章案例使用 CREATE TABLE `cs` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `num` int(10) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoD ...
  • Slow Log 簡介 用於記錄執行時間超過指定值的 SQL 語句的詳細信息,多用於調試和監控。 配置 因為開啟會略微影響性能,所以預設沒有開啟,所以需要配置。 查看是否開啟 show variables like '%slow%'; + + + | Variable_name | Value | ...
  • 註:以下所有內容均為自己總結的筆記,涉及底層原理,難度對標18K-25K薪資,偏理論,不保證百分百準確性。 索引查找快速的原理? 創建索引的本質是排序,排好序之後再找數據就快了。 對於B+tree索引,B+tree對數據排序後採用多路查找思想的非線性查找方案,減少了大量的查詢次數,從而避免多次磁碟i ...
  • 本文分享自華為雲社區《守護更多女性健康,華為雲GeminiDB助力美柚完成資料庫高效穩定遷移》,作者:華為雲頭條。 陽春三月,“三八”國際婦女節悄然而至。在社會快速發展的今天,女性力量在各個領域大放異彩,儘管女性成長路上可能會風雨兼顧,但是關註自己、保持身心健康才能走得更遠、看到更美的風景。美柚作為 ...
  • SQLQueryStress是SQL Server資料庫的一個壓測工具,這裡不打算介紹這款工具,而是淺析一下SQLQueryStress工具的一些指標涵義。如有疏漏或不足之處,敬請指正。 如下截圖所示,你會看到下麵一些指標 那麼對應指標的具體含義是啥呢?下麵表格整理了這些指標的含義; 很多同學對於C ...
  • 本期課程將從管理平臺的架構出發,結合平臺的實例管理、實例升級、容災管理和監控告警的功能和操作介紹,全面覆蓋日常運維操作,帶您理解並熟練運用GaussDB運維平臺完成運維工作。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...