mysql怎么確定用索引的 mysql怎么確定用索引的數(shù)據(jù)

「進(jìn)階」MySQL中如何使用索引

1、普通索引

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站制作、永福網(wǎng)絡(luò)推廣、重慶小程序開發(fā)公司、永福網(wǎng)絡(luò)營銷、永福企業(yè)策劃、永福品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供永福建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.muchs.cn

這是最基本的索引,它沒有任何限制。

2、唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

3、主鍵索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創(chuàng)建主鍵索引。

4、聚簇索引

聚簇索引的索引順序就是數(shù)據(jù)存儲的物理存儲順序,這樣能保證索引值相近的元組所存儲的物理位置也相近。

5、全文索引(FULLTEXT)

全文索引只能創(chuàng)建在數(shù)據(jù)類型為VARCHAR或TEXT的列上,建立全文索引后,能夠在建立了全文索引的列上進(jìn)行全文查找。全文索引只能在MyISAM存儲引擎的表中創(chuàng)建。

實際工作使用中,索引可以建立在單一列上,稱為單列索引,也可以建立在多個列上,稱為組合索引。

mysql是如何決定使用哪個索引的

索引一般建立在經(jīng)常出現(xiàn)在where子句中的字段,對于大的文本字段不建議加索引。

頻繁進(jìn)行數(shù)據(jù)庫操作的表,不建議建立太多的索引。

一個表不要加太多索引,會影響insert和update的效率。

MySql索引之哪些情況適合創(chuàng)建索引

說明:不要以為唯一索引影響了 insert 速度,這個速度損耗可以忽略,但提高查找速度是明顯的。

某個字段在SELECT語句的 WHERE 條件中經(jīng)常被使用到,那么就需要給這個字段創(chuàng)建索引了。尤其是在

數(shù)據(jù)量大的情況下,創(chuàng)建普通索引就可以大幅提升數(shù)據(jù)查詢的效率。

比如student_info數(shù)據(jù)表(含100萬條數(shù)據(jù)),假設(shè)我們想要查詢 student_id=123110 的用戶信息。

索引就是讓數(shù)據(jù)按照某種順序進(jìn)行存儲或檢索,因此當(dāng)我們使用 GROUP BY 對數(shù)據(jù)進(jìn)行分組查詢,或者

使用 ORDER BY 對數(shù)據(jù)進(jìn)行排序的時候,就需要 對分組或者排序的字段進(jìn)行索引 。如果待排序的列有多

個,那么可以在這些列上建立 組合索引 。

對數(shù)據(jù)按照某個條件進(jìn)行查詢后再進(jìn)行 UPDATE 或 DELETE 的操作,如果對 WHERE 字段創(chuàng)建了索引,就

能大幅提升效率。原理是因為我們需要先根據(jù) WHERE 條件列檢索出來這條記錄,然后再對它進(jìn)行更新或

刪除。如果進(jìn)行更新的時候,更新的字段是非索引字段,提升的效率會更明顯,這是因為非索引字段更

新不需要對索引進(jìn)行維護(hù)。

有時候我們需要對某個字段進(jìn)行去重,使用 DISTINCT,那么對這個字段創(chuàng)建索引,也會提升查詢效率。

比如,我們想要查詢課程表中不同的 student_id 都有哪些,如果我們沒有對 student_id 創(chuàng)建索引,執(zhí)行

SQL 語句:

運(yùn)行結(jié)果(600637 條記錄,運(yùn)行時間 0.683s ):

如果我們對 student_id 創(chuàng)建索引,再執(zhí)行 SQL 語句:

運(yùn)行結(jié)果(600637 條記錄,運(yùn)行時間 0.010s ):

你能看到 SQL 查詢效率有了提升,同時顯示出來的 student_id 還是按照 遞增的順序 進(jìn)行展示的。這是因

為索引會對數(shù)據(jù)按照某種順序進(jìn)行排序,所以在去重的時候也會快很多。

首先, 連接表的數(shù)量盡量不要超過 3 張 ,因為每增加一張表就相當(dāng)于增加了一次嵌套的循環(huán),數(shù)量級增

長會非常快,嚴(yán)重影響查詢的效率。

其次, 對 WHERE 條件創(chuàng)建索引 ,因為 WHERE 才是對數(shù)據(jù)條件的過濾。如果在數(shù)據(jù)量非常大的情況下,

沒有 WHERE 條件過濾是非??膳碌?。

最后, 對用于連接的字段創(chuàng)建索引 ,并且該字段在多張表中的 類型必須一致 。比如 course_id 在

student_info 表和 course 表中都為 int(11) 類型,而不能一個為 int 另一個為 varchar 類型。

舉個例子,如果我們只對 student_id 創(chuàng)建索引,執(zhí)行 SQL 語句:

運(yùn)行結(jié)果(1 條數(shù)據(jù),運(yùn)行時間 0.189s ):

這里我們對 name 創(chuàng)建索引,再執(zhí)行上面的 SQL 語句,運(yùn)行時間為 0.002s 。

創(chuàng)建一張商戶表,因為地址字段比較長,在地址字段上建立前綴索引

問題是,截取多少呢?截取得多了,達(dá)不到節(jié)省索引存儲空間的目的;截取得少了,重復(fù)內(nèi)容太多,字

段的散列度(選擇性)會降低。 怎么計算不同的長度的選擇性呢?

先看一下字段在全部數(shù)據(jù)中的選擇度:

通過不同長度去計算,與全表的選擇性對比:

公式:

例如:

引申另一個問題:索引列前綴對排序的影響

拓展:Alibaba《Java開發(fā)手冊》

【 強(qiáng)制 】在 varchar 字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據(jù)實際文本

區(qū)分度決定索引長度。

說明:索引的長度與區(qū)分度是一對矛盾體,一般對字符串類型數(shù)據(jù),長度為 20 的索引,區(qū)分度會 高達(dá)

90% 以上 ,可以使用 count(distinct left(列名, 索引長度))/count(*)的區(qū)分度來確定。

這樣也可以較少的建立一些索引。同時,由于"最左前綴原則",可以增加聯(lián)合索引的使用率。

結(jié)論:在數(shù)據(jù)表中的數(shù)據(jù)行數(shù)比較少的情況下,比如不到 1000 行,是不需要創(chuàng)建索引的。

舉例1:要在 100 萬行數(shù)據(jù)中查找其中的 50 萬行(比如性別為男的數(shù)據(jù)),一旦創(chuàng)建了索引,你需要先

訪問 50 萬次索引,然后再訪問 50 萬次數(shù)據(jù)表,這樣加起來的開銷比不使用索引可能還要大。

舉例2:假設(shè)有一個學(xué)生表,學(xué)生總數(shù)為 100 萬人,男性只有 10 個人,也就是占總?cè)丝诘?10 萬分之 1。

學(xué)生表 student_gender 結(jié)構(gòu)如下。其中數(shù)據(jù)表中的 student_gender 字段取值為 0 或 1,0 代表女性,1 代

表男性。

如果我們要篩選出這個學(xué)生表中的男性,可以使用:

運(yùn)行結(jié)果(10 條數(shù)據(jù),運(yùn)行時間 0.696s ):

結(jié)論:當(dāng)數(shù)據(jù)重復(fù)度大,比如 高于 10% 的時候,也不需要對這個字段使用索引。

例如身份證、UUID(在索引比較時需要轉(zhuǎn)為ASCII,并且插入時可能造成頁分裂)、MD5、HASH、無序長字

符串等。

① 冗余索引

舉例:建表語句如下

我們知道,通過 idx_name_birthday_phone_number 索引就可以對 name 列進(jìn)行快速搜索,再創(chuàng)建一

個專門針對 name 列的索引就算是一個 冗余索引 ,維護(hù)這個索引只會增加維護(hù)的成本,并不會對搜索有

什么好處。

② 重復(fù)索引

另一種情況,我們可能會對某個列 重復(fù)建立索引 ,比方說這樣:

我們看到,col1 既是主鍵、又給它定義為一個唯一索引,還給它定義了一個普通索引,可是主鍵本身就

會生成聚簇索引,所以定義的唯一索引和普通索引是重復(fù)的,這種情況要避免。

歡迎共同進(jìn)步:

QQ群:1007576722

本文標(biāo)題:mysql怎么確定用索引的 mysql怎么確定用索引的數(shù)據(jù)
地址分享:http://www.muchs.cn/article0/doocpoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、品牌網(wǎng)站設(shè)計、網(wǎng)站制作、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)