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中文網其他相關文章!

MySQL通過異步、半同步和組複製三種模式處理數據複製。 1)異步複製性能高但可能丟失數據。 2)半同步複製提高數據安全性但增加延遲。 3)組複製支持多主複製和故障轉移,適用於高可用性需求。

EXPLAIN語句可用於分析和提升SQL查詢性能。 1.執行EXPLAIN語句查看查詢計劃。 2.分析輸出結果,關注訪問類型、索引使用情況和JOIN順序。 3.根據分析結果,創建或調整索引,優化JOIN操作,避免全表掃描,以提升查詢效率。

使用mysqldump進行邏輯備份和MySQLEnterpriseBackup進行熱備份是備份MySQL數據庫的有效方法。 1.使用mysqldump備份數據庫:mysqldump-uroot-pmydatabase>mydatabase_backup.sql。 2.使用MySQLEnterpriseBackup進行熱備份:mysqlbackup--user=root--password=password--backup-dir=/path/to/backupbackup。恢復時,使用相應的命

MySQL慢查詢的主要原因包括索引缺失或不當使用、查詢複雜度、數據量過大和硬件資源不足。優化建議包括:1.創建合適的索引;2.優化查詢語句;3.使用分錶分區技術;4.適當升級硬件。

MySQL視圖是基於SQL查詢結果的虛擬表,不存儲數據。 1)視圖簡化複雜查詢,2)增強數據安全性,3)維護數據一致性。視圖是數據庫中的存儲查詢,可像表一樣使用,但數據動態生成。

mysqldiffersfromothersqldialectsinsyntaxforlimit,自動啟動,弦樂範圍,子征服和表面上分析。 1)MySqluessLipslimit,whilesqlserverusestopopandoraclesrontersrontsrontsrontsronnum.2)

MySQL分區能提升性能和簡化維護。 1)通過按特定標準(如日期範圍)將大表分成小塊,2)物理上將數據分成獨立文件,3)查詢時MySQL可專注於相關分區,4)查詢優化器可跳過不相關分區,5)選擇合適的分區策略並定期維護是關鍵。

在MySQL中,如何授予和撤銷權限? 1.使用GRANT語句授予權限,如GRANTALLPRIVILEGESONdatabase_name.TO'username'@'host';2.使用REVOKE語句撤銷權限,如REVOKEALLPRIVILEGESONdatabase_name.FROM'username'@'host',確保及時溝通權限變更。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。