日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql同时满足升序和降序_MySQL性能优化(三):索引

發布時間:2024/9/18 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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性能优化(三):索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。