mysql學習筆記 索引優化 1 索引失效原因

2021-10-06 07:54:29 字數 3316 閱讀 9902

索引失效應該避免

案例(索引失效)

# demo 資料

drop table if exists `staffs`;

create table `staffs` (

`id` int(11) not null auto_increment,

`name` varchar(24) not null comment '姓名',

`age` int(11) not null default '0' comment '年齡',

`pos` varchar(20) not null comment '職位',

`add_time` timestamp not null default current_timestamp on update current_timestamp comment '入職時間',

primary key (`id`),

key `idx_staffs_nameagepost` (`name`,`age`,`pos`)

) engine=innodb auto_increment=4 default charset=utf8 comment='員工記錄表';

-- ----------------------------

-- records of staffs

-- ----------------------------

insert into `staffs` values ('1', 'z3', '22', 'manager', '2020-03-14 15:28:53');

insert into `staffs` values ('2', 'july', '23', 'dev', '2020-03-14 15:29:31');

insert into `staffs` values ('3', '2000', '23', 'dev', '2020-03-14 15:29:46');

1.全值匹配我最愛

2.最佳左字首法則

如果索引了多列,要遵守最左字首法則。指的是查詢從索引的最左前列開始並且不跳過索引中的列。

3.不在索引列上做任何操作(計算、函式、(自動or手動)型別轉換),會導致索引失效而轉向全表掃瞄

# 案例:不走索引

explain select * from staffs where left(name,4) ="july";

4.儲存引擎不能使用索引中範圍條件右邊的列

# 案例:不走索引

explain select * from staffs where name = "july" and age > 25 and pos = "manage"

5.盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),

減少select *

6.mysql在使用不等於(!=或者<> )的時候無法使用索引會導致全表掃瞄

# 案例 :不會走索引

explain select * from staffs where name != 'july'

explain select * from staffs where name <> 'july'

7.is null ,is not null也無法使用索引i

#案例:不會走索引

explain select * from staffs where name is null

8.like以萬用字元開頭(』%abc…)mysql索引失效會變成全表掃瞄的操作

# 案例:不會走索引

explain select * from staffs where name like '%july%';

# 案例:會走索引

explain select * from staffs where name like 'july%';

問題:

解決like '%字串%'時索引不被使用的方法? ?

使用覆蓋索引 >是指建立的復合索引的字段

測試資料

create table `tb1_user` (

id int (11) not null auto_increment,

`name` varchar (20) default null,

`age` int (11) default null,

email varchar (20) default null,

primary key (id)

) engine = innodb auto_increment = 1 default charset = utf8;

insert into tb1_user(name ,age ,email) values('1aa1',21,'[email protected]');

insert into tb1_user(name ,age,email) values('2aa2' ,222,'[email protected]');

insert into tb1_user(name ,age,email) values('3aa3' ,265, '[email protected]');

insert into tb1_user(name ,age,email) values('4aa4' ,21,'[email protected]');

create index idx_user_nameage on tb1_user(name,age);

# 使用覆蓋索引

# 案例 :會走索引

explain select name,age from tb1_user where name like "%aa%";

# 案例: 不會走索引;因為email不是復合索引中的列;沒有覆蓋到

explain select name,age,email from tb1_user where name like "%aa%";

9.字串不加單引號索引失效

# 案例 :不會走索引

explain select * from staffs where name = 2000;

# 案例 :會走索引

explain select * from staffs where name = '2000';

10.少用or,用它來連線時會索引失效

# 案例:不走索引

explain select * from staffs where name='july' or name = 'z3';

Mysql優化 B Tree索引和Hash索引

b tree和普通的b tree不大一樣。有個 可以體驗這些資料結構 先看一下b tree 設定最大深度為3,插入10個數字,資料結構如上,他與普通的二叉樹區別在於每個節點有多個資料,相當於橫向擴充套件,減少深度。為什麼要減少深度 當資料量比較大的時候,mysql無法將索引全部載入到記憶體中,只能逐...

mysql優化學習筆記1

1.架構內容 myisam,innodb常用的兩種資料引擎,設計架構 連線層,服務層,引擎層,資料層 資料庫引擎對比 物件專案 myisam innodb 主外來鍵不支援 支援事物 表鎖,即使操作一條記錄也會鎖住整個表,不適合高併發的操作 行鎖,操作室只鎖住一行,不對其他行有影響,適合高併發的操作 ...

Mysql索引的優化(1)

索引對資料的印象非常的關鍵 索引的主要作用就是告訴儲存引擎如何快速的找到我們所需要的資料。當表的資料比較少時,查詢的頻率也比較低的情況下索引的作用可能還不是太明顯,因為這時候表中的資料差不多都可以快取到記憶體中。所以就算是全表掃瞄也不會太慢。而隨著表中的資料越來越多,查詢頻率也越來越高,記憶體已經不...