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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...