mysql-冗餘和重覆索引

来源:http://www.cnblogs.com/happyflyingpig/archive/2017/10/16/7663000.html
-Advertisement-
Play Games

mysql允許在相同列上創建多個索引,無論是有意還是無意,mysql需要單獨維護重覆的索引,並且優化器在優化查詢的時候也需要逐個地進行考慮,這會影響性能。 重覆索引是指的在相同的列上按照相同的順序創建的相同類型的索引,應該避免這樣創建重覆索引,發現以後也應該立即刪除。但,在相同的列上創建不同類型的索 ...


  mysql允許在相同列上創建多個索引,無論是有意還是無意,mysql需要單獨維護重覆的索引,並且優化器在優化查詢的時候也需要逐個地進行考慮,這會影響性能。

  重覆索引是指的在相同的列上按照相同的順序創建的相同類型的索引,應該避免這樣創建重覆索引,發現以後也應該立即刪除。但,在相同的列上創建不同類型的索引來滿足不同的查詢需求是可以的。

CREATE TABLE test(
  ID INT NOT NULL PRIMARY KEY,
  A INT NOT NULL,
  B INT NOT NULL,
  UNIQUE(ID),
  INDEX(ID),
) ENGINE=InnoDB;

  這段SQL創建了3個重覆索引。通常並沒有理由這麼做。

  冗餘索引和重覆索引有一些不同,如果創建了索引(a,b),再創建索引(a)就是冗餘索引,因為這隻是前面一個索引的首碼索引,因此(a,b)也可以當作(a)來使用,但是(b,a)就不是冗餘索引,索引(b)也不是,因為b不是索引(a,b)的最左首碼列,另外,其他不同類型的索引在相同列上創建(如哈希索引和全文索引)不會是B-Tree索引的冗餘索引,而無論覆蓋的索引列是什麼。

  冗餘索引通常發生再為表添加新索引的時候。例如,有人可能會增加一個新的索引(A,B)而不是擴展以後的索引(A)。還有一種情況是將一個索引擴展為(A,ID),其中ID是主鍵,對於InnoDB來說主鍵已經包含在二級索引中了,所以這也是冗餘的。

  大多數情況下都不需要冗餘索引,應該儘量擴展已有的索引而不是創建新索引,但也有時候處於性能方面的考慮需要冗餘索引,因為擴展已有的索引會導致其變得太大,從而影響其他使用該索引的查詢性能。如:如果在整數列上有一個索引,現在需要額外增加一個很長的varchar列來擴展該索引,那麼性可能會急劇下降,特別是有查詢把這個索引當作覆蓋索引,或者這是myisam表並且有很多範圍查詢的時候(由於myisam的首碼壓縮)

  比如,有一張userinfo表。這個表有1000000條數據,對每個state_id值大概有20000條記錄。在state_id有一個索引,那麼下麵的SQL我們稱之為Q1

SELECT count(*) FROM userinfo WHERE state_id=5; --Q1

  改查詢的執行速度大概是每秒115次(QPS)

  還有一個SQL,我們稱之為Q2

SELECT state_id,city,address FROM userinfo WHERE state_id=5; --Q2

  這個查詢的QPS是10,提升該索引性能最簡單的辦法就是狂戰索引為(state_id,city,address),讓索引能覆蓋查詢:

ALERT TABLE userinfo ADD KEY state_id_2(state_id,city,address);

  (註:state_id已經有索引了,根據前面的概念,這是一個冗餘索引而不是重覆索引)

怎麼找出冗餘索引和重覆索引呢?

1.可以使用Shlomi Noach的common_schema中的一些試圖來定位,common_schema是一系列可以安裝到伺服器上的常用的存儲和試圖。

2.可以使用Percona Toolkit中的pt_duplicate-key-checker,該工具通過分析表結構來找出冗餘和重覆的索引。

 

參考文獻:

 [1] Baron Schwartz等 著,寧海元等 譯 ;《高性能MySQL》(第3版); 電子工業出版社 ,2013


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

-Advertisement-
Play Games
更多相關文章
  • 今天遇到一個案例,在使用命令修改一個測試伺服器(SQL Server 2014標準版)的伺服器排序規則時,遇到了下麵錯誤信息 (具體賬號信息脫敏處理,隨機生成一個賬號密碼) The Windows account sa does not exist and cannot be provisioned... ...
  • 一查詢數值型數據: SELECT * FROM tb_name WHERE sum > 100; 查詢謂詞:>,=,<,<>,!=,!>,!<,=>,=< 二查詢字元串 SELECT * FROM tb_stu WHERE sname = '小劉' SELECT * FROM tb_stu WHER ...
  • 約束的概念:確保在列中輸入有效的值並維護表之間的關係。 Primary key約束 功能:primary key(主鍵約束),一個表中只能有一個,不能有空值,不能有重覆值. 創建表時定義約束:欄位名 數據類型[長度] primary key Unique約束功能:unique(唯一約束), 指定在同 ...
  • 經常有用戶遇到安裝近乎的時候,會卡在資料庫嚮導頁面。安裝環境也做了比對,沒有問題,Windows伺服器、Mysql5.0+版本的資料庫、.net framework也安裝正確了。環境沒問題,那是不是資料庫不對啊。然後又用可視化工具本地、異地遠程都能正常訪問資料庫,可仍然是卡在數據安裝的嚮導頁面,這究 ...
  • 近排自己學習了一款軟體finereport開發報表模塊,自己總結瞭如何瞭解需求,分析需求,再進行實踐應用開發,最後進行測試數據的準確性,部署報表到項目對應的模塊中顯示。 一、需求(根據需求文檔分析) 1.條件塊: 2.數據塊(一部分): 3.數據取值: 數據源全部來自EAS。通過“物料收發事物彙總” ...
  • 存儲在資料庫中的所有數據值均正確的狀態。如果資料庫中存儲有不正確的數據值,則該資料庫稱為已喪失數據完整性。 詳細釋義 詳細釋義 資料庫中的數據是從外界輸入的,而數據的輸入由於種種原因,會發生輸入無效或 錯誤信息。保證輸入的數據符合規定,成為了 資料庫系統,尤其是多用戶的 關係資料庫系統首要關註的問題 ...
  • java.sql.SQLSyntaxErrorException: ORA-00904: "column": 標識符無效 首先查看無效的列是不是orcale關鍵字 , 如果不是 , 查看與column欄位相關的所有內容 , 引用是否正確 儘量不要用select 中的欄位別名當做 where 或者 o ...
  • 獨立索引: 獨立索引是指索引列不能是表達式的一部分,也不能是函數的參數 例1: SELECT actor_id FROM actor WHERE actor_id+1=5 --這種寫法,就算在actor_id上建立了索引,也不起效 例2: SELECT .... WHERE TO_DAYS(CURR ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...