mysql索引了解一下

2021-10-06 17:24:29 字數 3294 閱讀 4636

索引是mysql中非常重要的知識,類似於書籍的目錄,可以提高檢索效率,降低資料庫的io成本。本文主要介紹最常用的b-tree索引。

b-tree索引結構見上圖。最底下的是葉子節點,上層是非葉子節點。非葉子節點中存放鍵值和指向下層的指標;葉子節點存放鍵值和資料,存放的資料根據實現的不同而不同。例如:

可以看到,通過索引查詢的複雜度變成了o(logn)。

聚簇索引並不是一種單獨的索引型別,而是一種資料儲存的方式。innodb通常將逐漸座位聚簇索引。如果建表時沒有指定主鍵,儲存引擎內部會隱式生成乙個主鍵當做聚簇索引。

聚簇索引有一些重要的優點:

聚簇索引也有一些缺點:

b-tree是乙個平衡樹,每次插入的時候都需要重新調整使樹平衡,mysql的資料是以「頁」為最小單位儲存在磁碟上,如果乙個頁儲存滿了,而新插入的資料需要放在該頁上,會導致頁**。因此會影響插入的效率,並且會增加索引檔案的占用空間。可見,聚簇索引最好使用自增的鍵作為聚簇索引,插入時按聚簇索引插入。下面是使用連續自增的列作為主鍵,和非連續的列作為主鍵的插入測試:

create table `info` (

`id` int(11) not null auto_increment,

`encr` varchar(64) default null,

`name` varchar(32) default null,

`***` char(1) default null,

`val` varchar(32) default null,

`birthday` date default null,

primary key (`id`)

);create table `tbl_info_e` (

`id` int(11) default null,

`encr` varchar(64) not null,

`name` varchar(32) default null,

`***` char(1) default null,

`val` varchar(32) default null,

`birthday` date default null,

primary key (`encr`)

);

包含所有需要查詢的字段值的索引是覆蓋索引。使用覆蓋索引可以極大的減少資料訪問量,避免對主鍵索引的二次查詢;使用覆蓋索引時,explain的extra列中有using index。

延遲關聯例項

create table `tbl` (

`id` bigint(20) not null auto_increment,

`val` int(11) not null default '0',

`source` int(11) default null,

primary key (`id`),

key `idx_k` (`val`)

)向上表中插入600萬資料,val是0 - 10的隨機數;現進行分頁查詢:

```select * from tbl where val=4 limit 250000,5; 耗時9.146s

select * from tbl a inner join (select id from tbl_rand where val=4 limit 250000,5) b on a.id=b.id; 耗時0.075s

如果查詢的列和排序的列都在索引中,並且索引列的排序規則和order by子句的順序一致,那麼mysql可以只掃瞄索引檔案而不需要使用臨時表進行排序。這樣會大大提高排序的效率。

使用索引排序sql的explain type列為index

說明一下「索引列的排序規則和order by子句的順序一致」:

-- 乙個答題的功能,記錄答題耗時和分數,檢視排名的話,根據分數和耗時來排序,分數高,耗時少的排名越高

create table `t_order` (

`userid` int(11) not null auto_increment,

`costtime` int(11) not null,

`score` int(11) not null,

primary key (`id`),

key `idx_t` (`score` desc,`costtime` asc)

);-- 下列語句可以使用索引進行排序

select userid from tbl order by score desc, costtime asc;

select userid from tbl order by score asc, costtime desc;

-- 下列需要用到臨時表

select userid from tbl order by score, costtime;

select userid from tbl order by score, costtime desc;

mysql優化group by使用索引有兩種方式:鬆散索引掃瞄和緊湊索引掃瞄。

鬆散索引掃瞄

使用鬆散索引掃瞄,explain中extra列**現using index for group-by。

滿足鬆散索引掃瞄需要滿足一下條件:

不滿足鬆散索引掃瞄,但是查詢欄位和group by欄位在索引中,查詢中存在常量比較的where條件,且該字段在group by欄位的前面或者中間(滿足覆蓋索引,extra 列**現using index)。

示例:

假定t1(c1,c2,c3,c4)表上有idx(c1,c2,c3)索引

以下查詢會使用鬆散索引查詢:

select c1, c2 from t1 where c1 < const group by c1, c2; 

select max(c3), min(c3), c1, c2 from t1 where c2 > const group by c1, c2; 

select c2 from t1 where c1 < const group by c1, c2; 

以下查詢會使用緊湊索引查詢:

select c1, c2, c3 from t1 where c2 = 'a' group by c1, c3; 

select c1, c2, c3 from t1 where c1 = 'a' group by c2, c3;

以下查詢使用臨時表:

select c1, c3 from t1 group by c1, c3;

Linux安裝mysql,了解一下?

系統centeros7 shell wget 安裝mysql源 shell yum localinstall mysql57 community release el7 8.noarch.rpm 檢查mysql源是否安裝成功 shell yum repolist enabled grep mysql...

了解一下NTLM

ntlm 在客戶機與伺服器之間提供身份認證的安全包。ntlm 身份驗證協議 是 質詢 應答身份驗證協議,是windows nt 4.0 及其早期版本中用於網路身份驗證的預設協議。windows 2000 中仍然支援該協議,但它不再是預設的。ntlm身份驗證過程 ntlm 是用於 windows nt...

了解一下 display flex

一 display flex flex 是flexuble box的縮寫,意為 彈性盒子 用來為盒狀模型提供最大的靈活性.任何乙個容器都可以指定為flex布局.box 行內元素也可以使用flex布局.box webkit核心的瀏覽器,必須加上 webkit box 注意為父級設計flex布局以後,子...