<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當MySQL單表記錄數過大時,增刪改查效能都會急劇下降。MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。除非單表資料未來會一直不斷上漲,否則不要一開始就考慮拆分,拆分會帶來邏輯、部署、運維的各種複雜度。一般以整型值
為主的表在千萬級以下,字串
為主的表在五百萬以下是沒有太大問題的,而事實上很多時候MySQL單表的效能依然有不少優化空間,甚至能正常支撐千萬級以上的資料量。
索引優勢和劣勢:
Mysql目前主要有以下幾種索引型別:FULLTEXT,HASH,BTREE,RTREE。
即為全文索引,目前只有MyISAM引擎支援。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以建立全文索引。
全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE “%word%"這類針對文字的模糊查詢效率較低的問題。
FULLTEXT(全文)索引,僅可用於MyISAM和InnoDB
雜湊索參照索引列的值計算該值的hashCode,然後在hashCode相應的位置存執該值所在行資料的物理位置,因為使用雜湊演演算法,因此存取速度非常快,但是一個值只能對應一個hashCode,而且是雜湊的分佈方式。由於HASH的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作為索引。
HASH索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。但是,這種高效是有條件的,即只在“=”和“in”條件下高效,對於範圍查詢、排序及組合索引仍然效率不高。
BTREE(B+TREE)索引就是一種將索引值按一定的演演算法,存入一個樹形的資料結構中(二元樹),每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。由於BTREE非葉子節點不儲存資料(data),因此所有的資料都要查詢至葉子節點,而葉子節點的高度都是相同的,因此所有資料的查詢速度都是一樣的。這是MySQL裡預設和最常用的索引型別。
RTREE在MySQL很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對於BTREE,RTREE的優勢在於範圍查詢。
主鍵自動建立唯一索引;經常作為查詢條件在WHERE或者ORDER BY;語句中出現的列要建立索引;作為排序的列要建立索引;查詢中與其他表關聯的欄位,外來鍵關係建立索引高並行條件下傾向組合索引;用於聚合函數的列可以建立索引,例如使用了max(column_1)或者count(column_1)時的column_1就需要建立索引。
經常增刪改的列不要建立索引;有大量重複的列不建立索引;表記錄太少不要建立索引。只有當資料庫裡已經有了足夠多的測試資料時,它的效能測試結果才有實際參考價值。如果在測試資料庫裡只有幾百條資料記錄,它們往往在執行完第一條查詢命令之後就被全部載入到記憶體裡,這將使後續的查詢命令都執行得非常快–不管有沒有使用索引。只有當資料庫裡的記錄超過了1000條、資料總量也超過了MySQL伺服器上的記憶體總量時,資料庫的效能測試結果才有意義。
在組合索引中不能有列的值為NULL,如果有,那麼這一列對組合索引就是無效的;在一個SELECT語句中,索引只能使用一次,如果在WHERE中使用了,那麼在ORDER BY中就不要用了;LIKE操作中,’%aaa%'不會使用索引,也就是索引會失效,但是’aaa%'可以使用索引;在索引的列上使用表示式或者函數會使索引失效,例如:
select * from table where ceate_time > unix_timestamp(curdate());
將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成當前時間由程式作為引數傳入:
select * from table where ceate_time > 1524561911;
欄位:
索引:
查詢sql:
1.索引是幹什麼的?
索參照於快速找出在某個列中有一特定值的行。不使用索引,mysql必須從第一條記錄開始讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,mysql能快速到達一個位置搜尋到資料檔案的中間,沒有必要檢視所有資料。
大多數mysql的索引(primary key、index、unique、fulltext)在B樹中儲存,只是空間列型別的索引使用R樹,並且memory表還支援hash索引。
2.索引好複雜,我該怎麼理解索引,有沒有一個更形象的例子?
索引就像是一本書的目錄。
3.索引越多越好?
大多數情況下,索引能大幅提高查詢效率。但是:資料變更(增刪改)都需要維護索引,因此更多索引意味著更多維護成本;也意味著需要更多控制元件空間(一本書100頁,卻有50頁目錄?);過小的表,建索引可能會更慢。
4.索引的欄位型別問題
text型別,也可建索引(需要指定長度);MyISAM儲存引擎長度綜合不能超過1000位元組;用來篩選的值儘量保持和索引列同樣的資料型別。
5.like能用到索引?
儘量減少like查詢,但是也不是絕對不可用,'xxx%'是可以用到索引的。除了like,以下操作符也可以用到索引:
<,<=,=,>,>=,between,in
這些用不到索引:
<>,not in,!=
6.什麼樣的欄位不適合建索引?
列的值唯一性太小(比如性別,型別),不適合建索引。(什麼叫大小?一般來說,同值的資料超過表的15%,那就沒有必要建索引了)更新非常頻繁的資料不適合建索引。
7.一次查詢能用多個索引?
不能
8.多列查詢該如何建索引?
一次查詢只能用到一個索引, a列建索引還是b列建索引?誰的區分度(同值的少)更高,建誰!當然,聯合索引也是個不錯的方案。
9.聯合索引的問題
-- 命中col1、col2聯合索引 select col1,col2 from test where col1 = 'xxx'; -- 不能命中col1、col2聯合索引 select col1,col2 from test where col2 = 'xxx';
所以大多數情況下,有col1、col2索引了,就不用再去建col1索引了
10.哪些常見的情況不能用到索引?
like '%xxx' not in !=
對列進行函數運算,如:
where md5(password) = "xxx"
存了數值的字串型別欄位(如手機號),查詢是記得不要丟掉值的引號,否則無法命中索引:
select * from test where mobile = 13800002222;
如果mobile欄位是char或者varchar型別,則上面查詢無法命中索引,應為:
select * from test where mobile = '13800002222';
11.NULL的問題
Null會導致索引形同虛設,所以在設計表結構應避免NULL的存在。
可用其他方式來表達,比如-1。
到此這篇關於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