從頭開始學MySQL 效能優化

2021-08-31 03:24:35 字數 2333 閱讀 1955

首先執行下面的sql,準備一些資料。

drop table if exists t_student;

create table `t_student` (

`id` int(11) not null auto_increment,

`name` varchar(255) not null,

`age` int(11) default null,

primary key (`id`),

index `nameidx` (`name`(3)) -- 增加一列索引

)

drop procedure if exists insertstu;

delimiter //

create procedure insertstu(in mycount int(11))

begin

declare id int(11) default 0;

while id < mycount do

set id = id + 1;

insert into t_student values(null,concat('大宇',''+id),id+22);

end while; --

end //

delimiter ;

call insertstu(10);

t_student表的資料 

首先看這張表裡面的索引。

除了主鍵的唯一索引以外,在name這一列上新增了nameidx索引。

再來看看使用模糊查詢,會不會影響索引的使用。

explain select * from t_student where name like '%大宇1';

從上述紅色方框裡面可知,沒有使用任何索引,並且查詢了10條資料,造成了全表掃瞄。原因是因為,只有"%"不在第乙個位置的時候,索引才會被使用。

再來寫乙個sql來證明上述的結論。

explain select * from t_student where name like '大宇1%';

上述分析結果說明這次使用了名為'nameidx'的索引,並且只掃瞄了2條記錄。索引的威力發揮了出來。

使用like關鍵字可能不會觸發索引,因此,只有"%"不在第乙個位置,索引才會發揮左右。

查詢語句中的查詢條件只有or關鍵字,並且or關鍵字前後兩個條件中的列都是索引的時候,才會使用索引。

show index from t_student;
在這張表裡面裡,共有三個列,分別為id、name、age,id使用的主鍵索引,name使用的是nameidx索引,而age列上沒有索引。

根據上述執行結果,在執行sql過程中僅僅使用了or關鍵字,並且過濾條件是id與name,在紅色方框裡面顯示了使用的索引。本次查詢掃瞄了掃瞄了2條記錄。

再執行下面的sql,其中id有索引,age沒有索引,看看情況會是什麼樣子。 

possible_keys說明了可能用到id的主鍵索引,但是key欄位說明本次掃瞄實際沒有用到任何索引。因此,rows的值為10,說明出現了全表掃瞄。

結論:查詢語句中的查詢條件只有or關鍵字,並且or關鍵字前後兩個條件中的列都是索引的時候,才會使用索引。

從頭開始學JDK String

目錄 string 倒序 string 建構函式 string equals string 記憶體 string hashcode string startswith string endwith string indexof string lastindexof string substring ...

從頭開始學MFC

一 win32專案設計 類似於console控制台程式,win32視窗程式的入口函式類似於main 函式,稱之為winmain函式 int winapi wwinmain hinstance hinstance,例項控制代碼 hinstance hprevinstance,前乙個例項控制代碼 pws...

從頭開始學Redis

第一章 概述 1.1 redis之簡介 1.2 redis之安裝 第二章 api 2.1 redisapi之簡介 2.2 redisapi之string 2.3 redisapi之hash 2.4 redisapi之list 2.5 redisapi之set 2.6 redisapi之zset 第三...