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,該工具透過分析表結構來找出冗餘和重複的索引。
以上是mysql中關於冗餘和重複索引的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL 數據庫中,用戶和數據庫的關係通過權限和表定義。用戶擁有用戶名和密碼,用於訪問數據庫。權限通過 GRANT 命令授予,而表由 CREATE TABLE 命令創建。要建立用戶和數據庫之間的關係,需創建數據庫、創建用戶,然後授予權限。

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

數據集成簡化:AmazonRDSMySQL與Redshift的零ETL集成高效的數據集成是數據驅動型組織的核心。傳統的ETL(提取、轉換、加載)流程複雜且耗時,尤其是在將數據庫(例如AmazonRDSMySQL)與數據倉庫(例如Redshift)集成時。然而,AWS提供的零ETL集成方案徹底改變了這一現狀,為從RDSMySQL到Redshift的數據遷移提供了簡化、近乎實時的解決方案。本文將深入探討RDSMySQL零ETL與Redshift集成,闡述其工作原理以及為數據工程師和開發者帶來的優勢。

1.使用正確的索引索引通過減少掃描的數據量來加速數據檢索select*fromemployeeswherelast_name='smith';如果多次查詢表的某一列,則為該列創建索引如果您或您的應用根據條件需要來自多個列的數據,則創建複合索引2.避免選擇*僅選擇那些需要的列,如果您選擇所有不需要的列,這只會消耗更多的服務器內存並導致服務器在高負載或頻率時間下變慢例如,您的表包含諸如created_at和updated_at以及時間戳之類的列,然後避免選擇*,因為它們在正常情況下不需要低效查詢se

要填寫 MySQL 用戶名和密碼,請:1. 確定用戶名和密碼;2. 連接到數據庫;3. 使用用戶名和密碼執行查詢和命令。

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

MySQL 中的複制粘貼包含以下步驟:選擇數據,使用 Ctrl C(Windows)或 Cmd C(Mac)複製;在目標位置右鍵單擊,選擇“粘貼”或使用 Ctrl V(Windows)或 Cmd V(Mac);複製的數據將插入到目標位置,或替換現有數據(取決於目標位置是否已存在數據)。

數據庫ACID屬性詳解ACID屬性是確保數據庫事務可靠性和一致性的一組規則。它們規定了數據庫系統處理事務的方式,即使在系統崩潰、電源中斷或多用戶並發訪問的情況下,也能保證數據的完整性和準確性。 ACID屬性概述原子性(Atomicity):事務被視為一個不可分割的單元。任何部分失敗,整個事務回滾,數據庫不保留任何更改。例如,銀行轉賬,如果從一個賬戶扣款但未向另一個賬戶加款,則整個操作撤銷。 begintransaction;updateaccountssetbalance=balance-100wh
