<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
根據Alibaba規範,指明在業務上具有唯一特性的欄位,即使是組合欄位,也必須建成唯一索引。
例如,學生表中的學號時具有唯一性的欄位,為該欄位建立唯一性索引可以快速查詢出某個學生的資訊,如果使用姓名的話,可能存在同名的情況,從而降低查詢速度。
某個欄位在Select語句的Where條件中經常被使用到,那麼就需要給這個欄位建立索引,尤其實在資料量大的情況下,建立普通索引就可以大幅提升查詢效率。
比如測試表student_info有100萬資料,假設查詢student_id=112322的使用者資訊,如果沒有對student_id欄位建立索引,查詢結果如下:
select course_id, class_id, name, create_time,student_id from student_info where student_id = 112322;# 花費211ms
為student_id建立索引後,查詢結果如下:
alter table student_info add index idx_sid(student_id); select course_id, class_id, name, create_time,student_id from student_info where student_id = 112322;# 花費3ms
索引就是讓資料按照某種順序進行儲存或檢索,因此當使用Group by對資料進行分組查詢或使用Order by對資料進行排序的時候 ,就需要對分組或排序的欄位進行索引。如果待排序的列有多個,那可以在這些列上建立組合索引。
比如,按照student_id對學生選秀的課程進行分組,顯示不同的student_id和課程的數量,顯示100條。如果不對student_id建立索引,查詢結果如下:
select student_id,count(*) as num from student_info group by student_id limit 100;#花費2.466s
為student_id建立索引後,查詢結果如下:
alter table student_info add index idx_sid(student_id); select student_id,count(*) as num from student_info group by student_id limit 100;#花費6ms
對於既有group by又有order by的查詢語句,建議最好建立聯合索引,並且將group by中的欄位放到order by欄位的前邊,滿足‘最左字首匹配原則’,這樣索引的利用率就會高,自然查詢的效率也就會高;同時8.0之後的版本支援降序索引,如果order by之後的欄位時降序的,可以考慮直接建立降序索引,也會提高查詢效率。
對資料按照某個條件進行查詢後再進行Update或Delete的操作,如果對Where欄位建立了索引,就能答覆提升效率。原因是因為需要先根據Where條件列檢索出來這條記錄,然後再對他進行更新或刪除。如果進行更新的時候,更新的欄位是非索引欄位,提升效率會更明顯,這是因為費索引欄位更新不需要對所以進行維護。
比如對student_info表中的name欄位為sdfasdfas123123的資料修改student_id為110119,在沒有對name欄位建立索引的情況下,執行情況如下:
update student_info set student_id = 110119 where name = 'sdfasdfas123123';#花費549ms
新增索引後,執行情況如下:
alter table student_info add index idx_name(name); update student_info set student_id = 110119 where name = 'sdfasdfas123123';#花費2ms
有時候需要對某個欄位進行去重,使用Distinct,那麼對這個建立索引也會提升查詢效率。
比如查詢課程表中不同student_id都有哪些,如果沒有為student_id建立索引,執行情況如下:
select distinct(student_id) from student_id;#花費2ms
建立索引後,執行情況如下:
alter table student_info add index idx_sid(student_id); select distinct(student_id) from student_id;#花費0.1ms
首先,連線表的資料量儘量不超過3張,因為每增加一張表就相當於增加了一次巢狀的迴圈,數量級增長非常快,嚴重影響查詢效率。其次,對Where條件建立索引,因為Where才是對資料條件的過濾,如果再資料量非常大的情況下,沒有Where條件過濾時非常可怕的,最後,對於連線的欄位建立索引,並且改欄位再多張表中型別必須一致。
比如,只對student_id建立索引,查詢結果如下:
select course_id, name, student_info.student_id,course_name from student_info join course on student_info.course_id = course.course_id where name = 'aAAaAA'; #花費176ms
給name欄位建立索引後,查詢結果如下:
alter table student_info add index idx_name(name); select course_id, name, student_info.student_id,course_name from student_info join course on student_info.course_id = course.course_id where name = 'aAAaAA'; #花費2ms
這裡所說的型別小值意思是該型別表示的資料範圍的大小。比如在定義表結構的時候要顯示的指定列的型別,以整數型別為例,有TINYINT、MEDIUMINT、INT、BIGINT等,他們佔用的儲存空間依次遞增,能表示的資料範圍也是一次遞增。如果相對某個整數列建立索引的話,在表示的整數範圍允許的情況下,儘量讓索引列使用較小的型別,例如能使用INT不要使用BIGINT,能使用MEDIUMINT不使用INT,原因如下:
上述對於主鍵來說很合適,因為在聚簇索引中既儲存了資料,也儲存了索引,可以很好的減少磁碟I/O;而對於二級索引來說,還需要一次回表操作才能查到完整的資料,也就能加了一次磁碟I/O。
根據Alibaba開發手冊,在字串上建立索引時,必須指定索引長度,沒有必要對全欄位建立索引。
比如有一張商品表,表中的商品描述欄位較長,在描述欄位上建立字首索引如下:
create table product(id int, desc varchar(120) not null); alter table product add index(desc(12));
區分度的計算可以使用count(distinct left(列名, 索引長度))/count(*)來確定。
列的基數值得時某一列中不重複資料的個數,比如說某個列包含值2,5,3,6,2,7,2,雖然有7條記錄,但該列的基數卻是5,也就是說,在記錄行數一定的情況下,列的基數越大,該列中的值就越分散;列的基數越小,該列中的值就越集中。這裡列的基數指標非常重要,直接影響是否能有效利用索引。最好為列的基數大的列建立索引,為基數太小的列建立索引效果反而不好。
可以使用公式select count(distinct col)/count(*) from table
來計算區分度,越接近1區分度越好。
這條就是通常說的最左字首匹配原則。 通俗來講就是將Where條件後經常使用的條件欄位放在索引的最左邊,將使用頻率相對低的放到右邊。
通常索引的建立是有代價的,如果建立索引的欄位沒有出現在where條件(包括group by、order by)中,建議一開始就不要建立索引或將索引刪除,因為索引的存在也會佔用空間。
在條件表示式中經常用到的不同值較多的列上建立索引,但欄位中如果有大量重複資料,也不用建立索引。比如學生表中的性別欄位,只有男和女兩種值,因此無需建立索引。如果建立索引,不但不會提高查詢效率,反而會嚴重降低資料更新速度。
4、避免對經常更新的表建立過多的索引
例如身份證、UUID(在索引比較時需要轉為ASCII,並且插入時可能造成頁分裂)、MD5、HASH、無序長字串等。
表中的資料被大量更新或者資料的使用方式被改變後,原有的一些索引可能不會被使用到。DBA應定期找出這些索引並將之刪除,從而較少無用索引對更新操作的影響。
例如身份證、UUID(在索引比較時需要轉為ASCII,並且插入時可能造成頁分裂)、MD5、HASH、無序長字串等。
表中的資料被大量更新或者資料的使用方式被改變後,原有的一些索引可能不會被使用到。DBA應定期找出這些索引並將之刪除,從而較少無用索引對更新操作的影響。
到此這篇關於MySQL索引建立原則的文章就介紹到這了,更多相關MySQL索引建立原則內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45