mysql reverse索引 mysql之索引

2021-10-18 20:49:25 字數 4651 閱讀 4719

索引

索引的介紹

資料庫中專門用於幫助使用者快速查詢資料的一種資料結構。類似於字典中的目錄,查詢字典內容時可以根據目錄查詢到資料的存放位置嗎,然後直接獲取。

索引的作用

約束和加速查詢

使用索引原因

因為在索引結構中是按照b+樹索引以及hash索引來進行存放資料的

hash索引和btree索引

(1)hash型別的索引:查詢單條快,範圍查詢慢

(2)btree型別的索引:b+樹,層數越多,資料量指數級增長(我們就用它,因為innodb預設支援它)

常見索引

普通索引

作用:僅有乙個加速查詢(就是在建立表中任意乙個字段)

建立表+普通索引

create table userinfo(

nid intnotnull auto_increment primary key,

name varchar(32) notnull,

email varchar(64) notnull,

index ix_name(name)

建立普通索引

create index 索引的名字 on 表名(列名)

刪除索引

drop index 索引的名字 on 表名

檢視索引

show index from 表名

唯一索引

唯一索引有兩個功能:加速查詢和唯一約束(可含null)簡單來說(唯一索引就是與普通索引類似,但是不同就是索引列的值必須唯一,但允許有空值)即允許null+不重複

create table userinfo(

id intnotnull auto_increment primary key,

name varchar(32) notnull,

email varchar(64) notnull,

unique index ix_name(name)

建立表+唯一索引

建立唯一索引

create unique index 索引名 on 表名(列名)

刪除唯一索引

drop index 索引名 on 表名;

主鍵索引

主鍵索引有兩個功能: 加速查詢和唯一約束(不含null),主鍵索引就是不允許有空值而且也不能重複,簡單來說就是資料唯一且不允許null

create table userinfo(

id intnotnull auto_increment primary key,

name varchar(32) notnull,

email varchar(64) notnull,

unique index ix_name(name)

)orcreate tab le userinfo(

id intnotnull auto_increment,

name varchar(32) notnull,

email varchar(64) notnull,

primary key(nid),

unique index ix_name(name)

主鍵索引

alter table 表名 add primary key(列名);

刪除主鍵索引

alter table 表名 drop primary key;

alter table 表名 modify 列名 int, drop primary key;

組合索引(聯合索引)

組合索引是將n個列組合成乙個索引

其應用場景為:頻繁的同時使用n列來進行查詢,如:where name = 'alex' and email = '[email protected]'。

create index 索引名 on 表名(列名1,列名2);

聯合唯一索引

多列組成乙個索引+唯一

索引名詞

#覆蓋索引:在索引檔案中直接獲取資料

例如:select namefrom userinfo where name = 'alex50000';#索引合併:把多個單列索引合併成使用

例如:select* from userinfo where name = 'alex13131' and id = 13131;

正確使用索引的情況

資料庫表中新增索引後確實會讓查詢速度起飛,但前提必須是正確的使用索引來查詢,如果以錯誤的方式使用,則即使建立索引也會不奏效。

使用索引,我們必須知道:

(1)建立索引

(2)命中索引

(3)正確使用索引

#1. 準備表

create table userinfo(

id int,

name varchar(20),

gender char(6),

email varchar(50)

);#2. 建立儲存過程,實現批量插入記錄

delimiter $$ #宣告儲存過程的結束符號為$$

create procedure auto_insert1()

begin

declare i int default1;while(i<3000000)do

insert into userinfo values(i,concat('alex',i),'male',concat('egon',i,'@oldboy'));

set i=i+1;

endwhile;

end$$#$$結束

delimiter ; #重新宣告分號為結束符號

#3. 檢視儲存過程

show create procedure auto_insert1\g#4. 呼叫儲存過程

call auto_insert1();

準備300w條資料

- like '%xx'select* from userinfo where name like '%al';-使用函式

select* from userinfo where reverse(name) = 'alex333';- orselect* from userinfo where id = 1 or email = 'alex122@oldbody';

特別的:當or條件中有未建立索引的列才失效,以下會走索引

select* from userinfo where id = 1 or name = 'alex1222';

select* from userinfo where id = 1 or email = 'alex122@oldbody' and name = 'alex112'

-型別不一致

如果列是字串型別,傳入條件是必須用引號引起來,不然...

select* from userinfo where name = 999;- !=select count(*) from userinfo where name != 'alex'特別的:如果是主鍵,則還是會走索引

select count(*) from userinfo where id != 123

- >select* from userinfo where name > 'alex'特別的:如果是主鍵或索引是整數型別,則還是會走索引

select* from userinfo where id > 123select* from userinfo where num > 123

-order by

select emailfromuserinfo order by name desc;

當根據索引排序時候,選擇的對映如果不是索引,則不走索引

特別的:如果對主鍵排序,則還是走索引:

select* fromuserinfo order by nid desc;-組合索引最左字首

如果組合索引為:(name,email)

nameand email --使用索引

name--使用索引

email-- 不使用索引

什麼是最左字首呢?

最左字首匹配:

create index ix_name_email on userinfo(name,email);

select* from userinfo where name = 'alex';

select* from userinfo where name = 'alex' and email='alex@oldbody';

select* from userinfo where email='alex@oldbody';

如果使用組合索引如上,name和email組合索引之後,查詢

(1)name和email ---使用索引

(2)name ---使用索引

(3)email ---不適用索引

對於同時搜尋n個條件時,組合索引的效能好於多個單列索引******組合索引的效能》索引合併的效能*********

索引的注意事項

(1)避免使用select *(2)count(1)或count(列) 代替count(*)

(3)建立表時盡量使用char代替varchar

(4)表的字段順序固定長度的字段優先

(5)組合索引代替多個單列索引(經常使用多個條件查詢時)

(6)盡量使用短索引 (create index ix_title on tb(title(16));特殊的資料型別 text型別)

(7)使用連線(join)來代替子查詢

(8)連表時注意條件型別需一致

(9)索引雜湊(重複少)不適用於建索引,例如:性別不合適

M檔案與M函式

函式檔案由function語句引導,其基本結構為 function 輸出參數列 函式名 輸入參數列0 注釋說明部分 函式體語句 其中以function開頭的一行為引導行,表示該m檔案是乙個函式。函式名的命名規則與變數名相同。輸入形參為函式的輸入引數,輸出形參為函式的輸出型引數。當輸出從形參多於乙個時...

什麼是M2M模型以及M2M團隊計畫

什麼是 m2m模型 m2m模型是巨集觀到微觀 macro to micro 演算法模型的簡稱,但巨集觀到微觀只是對這個模型最為概括,最為簡潔的描述而已,它遠不能涵蓋這個模型的全部細節。m2m模型不僅僅強調巨集觀到微觀的解決問題的思路的重要性,更重要的是,它告訴人們如何從巨集觀到微觀去解決問題,巨集觀...

貨幣供應量 M0 M1 M2

貨幣 量 money supply supply of money 亦稱貨幣存量 貨幣 指某一時點流通中的現金量和存款量之和。貨幣 量是各國 銀行編制和公布的主要經濟統計指標之一。流動性是指銀行滿足存款人提取現金 到期支付債務和借款人正常貸款的能力。貨幣的流動性強弱代表了貨幣在流通中的周轉次數的多少...