mysql同时满足升序和降序_MySQL性能优化(三):索引
點擊上方藍色“碼農架構”,選擇“設為星標”
專注于高可用、高性能、高并發類技術分享!
索引原理
如果一本新華字典假如沒有目錄,想要查找某個字,就不得不從第一頁開始查找,一直找到最后一頁(如果要找的字在最后一頁),這個過程非常耗時,這種場景相當于數據庫中的全表掃描的概念,也就是循環表中的每一條記錄看看該記錄是否滿足條件,掃描次數為表的總記錄數。
新華字典中都會有目錄都有查找方法(比如按拼音查找、按部首查找),假如按拼音查找,我們根據拼音就能瞬速定位到要找的漢字,而這個漢字后面還有這個漢字對應的頁數,我們直接翻到該頁就能找到,整個查找過程非常快,用時非常短。這個原理就是數據庫中索引的原理。這里的按拼音查找、按部首查找是兩種不同的查找方式,通過每種方式都能快速找到,在數據庫中也有很多查找方式,稱之為索引方法,有BTREE、HASH兩種方式
BTREE:一顆倒立的樹,每個節點都有父節點,父節點下面的節點稱之為子節點(葉子節點),比父節點值小的位于父節點下面的左方,比父節點值大的子節點放置在父節點下面的右下方。
記錄索引列的值和對應的記錄所在的磁盤位置,每次排除掉一半, 檢索一次相當排除掉2的n次冪,使用二叉樹排除30次相當于全表排除10億次。比如查詢id=11的值,首先和6比,比6大就排除掉左邊的,繼續和9比較,11比9大,又排除掉左邊的一般,和11進行比較,相等就找到了結果。當數據量很大的時候,每次都排除掉一半,排除的數據量是非常驚人的。
Hash:Hash索引只能等值匹配,想范圍查詢,左前綴查詢都不適用, 其余大部分場景
為什么要使用索引?
索引大大減少了存儲引擎需要掃描的數據量
索引可以幫助我們進行排序以避免使用臨時表
索引可以把隨機IO變為順序IO
索引類型
主鍵索引(primary key):添加了主鍵就有了主鍵索引,可以在創建表的時候指定主鍵,也可以在創建成功之后再增加
唯一索引(unique):添加了唯一約束就有了唯一索引,唯一索引可以有多個null
普通索引(normal):一般是先建表,后面再創建索引,普通索引使用的最多
全文索引(fulltext):主要針對文本段落等,全文索引只能應用MyISAM引擎
空間索引(spatial): 使用較少,并且mysql支持的還不好
關于唯一性有兩種做法:
通過程序來保證數據的唯一性
業務上具有唯一特性的字段,即使是多個字段的組合,也必須建成唯一索引。說明:不要以為唯一索引影響了 insert 速度,這個速度損耗可以忽略,但提高查找速度是明顯的;另外即使在應用層做了非常完善的校驗控制,只要沒有唯一索引,根據墨菲定律,必然有臟數據產生。(來自阿里巴巴Java開發手冊)
關于全文索引:
全文索引只能用于MyISAM引擎,通常如果用到全文索引一般通過Elasticsearch、Solr、Lucene等技術來實現。
索引語法
創建索引
①語法
--?創建普通索引:create?index?索引名?on?表(列1【ASC|DESC】,?列2?ASC|DESC】)?
--?創建唯一索引
create?unique?index?on?表名(列名)
②索引命名規則
主鍵索引名為 pk_字段名,pk即 primary key
唯一索引名為 uk_字段名; uk即 unique key
普通索引名則為 idx_字段名;idx即index的簡稱。
③索引字段
一個索引可以針對一個字段進行創建,也可以指定多個字段創建復合索引。
④在哪些列上適合添加索引
頻繁作為查詢條件的列或者連接條件的列適合創建索引,即Where中的列或者是連接子句指定的列
唯一性太差的字段不適合創建索引,如性別
更新非常頻繁的字段不適合創建索引
不作為where條件的字段不要創建索引
選用NOT NULL的列
盡量使用字段長度小的列作為索引
使用數據類型簡單的列(int 型,固定長度)
⑤索引順序
ASC | DESC 選項 除非顯式指定降序 (DESC),否則列以升序 (ASC) 排序。不管索引是升序排列還是降序排列,在執行升序或降序 ORDER BY 操作時都會使用索引。但是如果通過混合的升序和降序屬性來執行 ORDER BY,則僅當索引是用同樣的升序和降序屬性創建的時才使用索引。
--?可以顯式指定索引字段的順序,默認為升續CREATE?INDEX?idx_username?ON?tbl_user(username?ASC);
--?對于較長的字符內容可以指定前N個字節創建索引,沒必要為整個值都創建索引
CREATE?INDEX?idx_username?ON?tbl_user(contnet(20)?ASC);
--?復合索引:基于多個字段共同創建索引(區分度最大的字段放在前面,經常會被使用到的列在前面)
CREATE?INDEX?idx_username_email?ON?tbl_user(username,?email);
--?刪除索引
DROP?INDEX?idx_username?ON?tbl_user;
--?查看某個表的索引,兩種方式效果一樣
SHOW?INDEX?FROM?tbl_user;
SHOW?KEYS?FROM?tbl_user;
⑥注意
如果是先建表,表中有比較多的數據,此時再創建索引,創建完索引需要等一會,讓索引在后臺創建完再使用
索引數量控制,單張表中索引數量不應超過5個,單個索引中的字段數不超過5個。
索引存儲的位置位于mysql安裝的/xxx/data目錄下, 索引能提高查詢速度,但對update/delete/insert變慢,因為還要重新維護索引文件,一般情況下查詢次數遠大于增刪改
查詢索引
show?index?from?表名;show?keys?from?表名;
修改索引
一般是先刪除再創建刪除索引
-?刪除重復和冗余的索引(第三方工具需要額外安裝)pt-duplicate-key-checker?h=127.0.0.1
--?更新索引統計信息及減少索引碎片
ANALYZE?TABLE?--?清理碎片(注意會鎖表)OPTIMIZE?table?
MySQL索引的原理,B+樹、聚集索引和二級索引的結構分析
MySQL性能優化(一):多種優化 方式介紹
MySQL性能優化(二):優化數據庫設計
總結
以上是生活随笔為你收集整理的mysql同时满足升序和降序_MySQL性能优化(三):索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西柚的功效与作用、禁忌和食用方法
- 下一篇: mysql子查询存到另一张表_MySQL