索引
索引的介紹
資料庫中專門用於幫助使用者快速查詢資料的一種資料結構。類似於字典中的目錄,查詢字典內容時可以根據目錄查詢到資料的存放位置嗎,然後直接獲取。
索引的作用
約束和加速查詢
使用索引原因
因為在索引結構中是按照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 亦稱貨幣存量 貨幣 指某一時點流通中的現金量和存款量之和。貨幣 量是各國 銀行編制和公布的主要經濟統計指標之一。流動性是指銀行滿足存款人提取現金 到期支付債務和借款人正常貸款的能力。貨幣的流動性強弱代表了貨幣在流通中的周轉次數的多少...