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