本文目錄一覽:
- 1、Mysql建立索引經驗
- 2、mysql索引
- 3、MySQL索引
- 4、mysql 索引
- 5、MYSQL的索引主要作用是什麼!
- 6、MySQL數據庫的四類索引?
Mysql建立索引經驗
在實際開發中使用數據庫時,難免會遇到一些大表數據,對這些數據進行查詢時,有時候SQL會查詢得特別慢,這時候,有經驗的老師傅會告訴你,你看一下哪幾個字段查的多,加一個索引就好了。
那麼,怎麼合理地建立索引呢?這裡分享一下我的一些經驗,如有不妥之處,歡迎批評指正。
1、不要盲目建立索引 , 先分析再創建
索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進行增刪改時,索引樹也要同樣地進行維護。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發完成後,分析一下,去針對大多數的查詢,建立聯合索引。
2、使用聯合索引盡量覆蓋多的條件
這是說在一個慢sql里假如有五個where ,一個 order by ,那麼我們的聯合索引盡量覆蓋到這五個查詢條件,如果有必要,order by 也覆蓋上 。
3、小基數字段不需要索引
這個意思是,如果一張表裡某個字段的值只有那麼幾個,那麼你針對這個字段建立的索引其實沒什麼意義,比如說,一個性別字段就兩種結果,你建了索引,排序也沒什麼意思(也就是索引里把男女給分開了)
所以說,索引盡量選擇基數大的數據去建立,能最大化地利用索引
4、長字符串可以使用前綴索引
我們建立索引的字段盡量選擇字段類型較小的,比如一個varchar(20)和varchar(256)的,我們在20的上面建立的索引和在256上就有明顯的差距(字符串那麼長排序也不好排呀,唉)。
當然,如果一定是要對varchar(256)建立索引,我們可以選擇裡面的前20個字符放在索引樹里(這裡的20不絕對,選擇能盡量分辨數據的最小字符字段設計),類似這樣KEY index(name(20),age,job) ,索引只會對name的前20個字符進行搜索,但前綴索引無法適用於order by 和 group by。
5、對排序字段設計索引的優先級低
如果一個SQL里我們出現了範圍查找,後邊又跟着一個排序字段,那麼我們優先給範圍查找的字段設置索引,而不是優先排序。
6、如果出現慢SQL,可以設計一個只針對該條SQL的聯合索引。
不過慢SQL的優化,需要一步步去進行分析,可以先用explain查看SQL語句的分析結果,再針對結果去做相應的改進。explain的東西我們下次再講。
PS:在 select 語句之前增加 explain 關鍵字,MySQL 會在查詢上設置一個標記,執行查詢會返回執行計劃的信息,而不是 執行這條SQL。
mysql索引
在mysql中,索引是一種特殊的數據庫結構,由數據表中的一列或多列組合而成,可以用來快速查詢數據表中有某一特定值的記錄。
通過索引,查詢數據時不用讀完記錄的所有信息,而只是查詢索引列即可。
通過索引,查詢數據時不用讀完記錄的所有信息,而只是查詢索引列。否則,數據庫系統將讀取每條記錄的所有信息進行匹配。
可以把索引比作新華字典的音序表。例如,要查“庫”字,如果不使用音序,就需要從字典的 400 頁中逐頁來找。但是,如果提取拼音出來,構成音序表,就只需要從 10 多頁的音序表中直接查找。這樣就可以大大節省時間。
因此,使用索引可以很大程度上提高數據庫的查詢速度,還有效的提高了數據庫系統的性能。
索引的優缺點
索引有其明顯的優勢,也有其不可避免的缺點。
優點
索引的優點如下:
1、通過創建唯一索引可以保證數據庫表中每一行數據的唯一性。
2、可以給所有的 MySQL 列類型設置索引。
3、可以大大加快數據的查詢速度,這是使用索引最主要的原因。
4、在實現數據的參考完整性方面可以加速表與表之間的連接。
5、在使用分組和排序子句進行數據查詢時也可以顯著減少查詢中分組和排序的時間
缺點
增加索引也有許多不利的方面,主要如下:
1、創建和維護索引組要耗費時間,並且隨着數據量的增加所耗費的時間也會增加。
2、索引需要佔磁盤空間,除了數據表占數據空間以外,每一個索引還要佔一定的物理空間。如果有大量的索引,索引文件可能比數據文件更快達到最大文件尺寸。
3、當對表中的數據進行增加、刪除和修改的時候,索引也要動態維護,這樣就降低了數據的維護速度。
使用索引時,需要綜合考慮索引的優點和缺點。
MySQL索引
MySQL的Innodb存儲引擎的索引分為聚集索引和非聚集索引兩大類
特點:B+樹葉子節點存儲行數據
一個表中,必須有一個聚集索引,只能有一個聚集索引,Innodb通常把一個表的主鍵索引作為聚集索引,如果沒有主鍵InnoDB會選擇一個唯一索引代替。如果沒有這樣的索引,InnoDB會隱式的定義一個主鍵來作為聚集索引,這個字段為6個字節,類型為長整形。
利用主鍵索引查找行數據是最快的,建議使用自增主鍵原因是利於索引樹的構建(主鍵自增寫入時新插入的數據不會影響到原有頁,插入效率高;但是如果主鍵是無序的或者隨機的,那每次的插入可能會導致原有頁頻繁的分裂,影響插入效率)
特點:B+樹葉子節點存儲主鍵ID
一個表中可以有多個非聚集索引,每個非聚集索引即是一棵B+樹
通過非聚集索引查找數據時,需要先在非聚集索引上找到主鍵ID,再從聚集索引獲取行數據,這個過程就稱之為回表
B樹索引中的B樹實際上是B+樹,至於為什麼使用B+樹而不使用B樹或者紅黑樹的原因在另外的文章中有提及。
特點:
特點:類似JDK中的HashMap,但無法支持範圍查詢
特點:使用的算法仍然是B樹索引,不同的就是索引列的值必須唯一
對於普通索引來說,查找到滿足條件的第一個記錄後,需要查找下一個記錄,直到碰到第一個不滿足條件的記錄。
對於唯一索引來說,由於索引定義了唯一性,查找到第一個滿足條件的記錄後,就會停止繼續檢索,提升索引性能
另外插入行時會構建該唯一索引,假如索引值重複將插入失敗,適合業務上做唯一性檢驗
通過建立倒排索引,可以極大的提升檢索效率,解決判斷字段是否包含的問題,但是業務上一般都不採用這種索引,而是使用ES處理全文搜索需求
僅對某個特定字段建立的索引,如(biz_id)
對多個字段建立的索引,如(biz_id,type)
mysql 索引
二級索引??
mysql中每個表都有一個聚簇索引(clustered index ),除此之外的表上的每個非聚簇索引都是二級索引,又叫輔助索引(secondary indexes)。
以InnoDB來說,每個InnoDB表具有一個特殊的索引稱為聚集索引。如果您的表上定義有主鍵,該主鍵索引是聚集索引。如果你不定義為您的表的主鍵時,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作為主鍵,InnoDB使用它作為聚集索引。如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,它有六個字節,而且是隱藏的,使其作為聚簇索引。
聚簇索引主要是為了方便存儲。。所以二級索引應該都是對聚簇索引的索引。
下面是Mysql Manual上的原話,也可能我理解有誤。
Every InnoDB table has a special index called the clustered index where the data for the rows is stored. If you define a PRIMARY KEY on your table, the index of the primary key is the clustered index.
If you do not define a PRIMARY KEY for your table, MySQL picks the first UNIQUE index that has only NOT NULL columns as the primary key and InnoDB uses it as the clustered index. If there is no such index in the table, InnoDB internally generates a hidden clustered index on a synthetic column containing row ID values. The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order.
Accessing a row through the clustered index is fast because the row data is on the same page where the index search leads. If a table is large, the clustered index architecture often saves a disk I/O operation when compared to storage organizations that store row data using a different page from the index record. (For example, MyISAM uses one file for data rows and another for index records.)
In InnoDB, the records in non-clustered indexes (also called secondary indexes) contain the primary key value for the row. InnoDB uses this primary key value to search for the row in the clustered index. If the primary key is long, the secondary indexes use more space, so it is advantageous to have a short primary key.
MYSQL的索引主要作用是什麼!
索引可以加快數據檢索操作,但會使數據修改操作變慢。每修改數據記錄,索引就必須刷新一次。為了在某種程度上彌補這一缺陷,許多SQL命令都有一個DELAY_KEY_WRITE項。
這個選項的作用是暫時制止MySQL在該命令每插入一條新記錄和每修改一條現有之後立刻對索引進行刷新,對索引的刷新將等到全部記錄插入/修改完畢之後再進行。在需要把許多新記錄插入某個數據表的場合,DELAY_KEY_WRITE選項的作用將非常明顯。
另外,索引還會在硬盤上佔用相當大的空間。因此應該只為最經常查詢和最經常排序的數據列建立索引。如果某個數據列包含許多重複的內容,為它建立索引就沒有太大的實際效果。
擴展資料
從理論上講,完全可以為數據表裡的每個字段分別建一個索引,但MySQL把同一個數據表裡的索引總數限制為16個。
與InnoDB數據表相比,在InnoDB數據表上,索引對Inn數據表的重要性要大得多。在 InnoDB 數據表上,索引不僅會在搜索數據記錄時發揮作用,還是數據行級鎖定機制的基礎。
在為MySQL分配足夠的內存之前,請考慮不同領域對MySQL的內存需求。要考慮的關鍵領域是:並發連接——對於大量並發連接,排序和臨時表將需要大量內存。在撰寫本文時,對於處理3000+並發連接的數據庫,16GB到32GB的RAM是足夠的。
參考資料來源:百度百科-MySQL數據庫
參考資料來源:百度百科-mySQL
MySQL數據庫的四類索引?
index —- 普通索引,數據可以重複,沒有任何限制。
unique —- 唯一索引,要求索引列的值必須唯一,但允許有空值;如果是組合索引,那麼列值的組合必須唯一。
primary key —- 主鍵索引,是一種特殊的唯一索引,一個表只能有一個主鍵,不允許有空值,一般是在創建表的同時創建主鍵索引。
組合索引 —- 在多個字段上創建的索引,只有在查詢條件中使用了創建索引時的第一個字段,索引才會被使用。
fulltext —- 全文索引,是對於大表的文本域:char,varchar,text列才能創建全文索引,主要用於查找文本中的關鍵字,並不是直接與索引中的值進行比較。fulltext更像是一個搜索引擎,配合match against操作使用,而不是一般的where語句加like。
注:全文索引目前只有MyISAM存儲引擎支持全文索引,InnoDB引擎5.6以下版本還不支持全文索引
所有存儲引擎對每個表至少支持16個索引,總索引長度至少為256字節,索引有兩種存儲類型,包括B型樹索引和哈希索引。
索引可以提高查詢的速度,但是創建和維護索引需要耗費時間,同時也會影響插入的速度,如果需要插入大量的數據時,最好是先刪除索引,插入數據後再建立索引。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/304240.html