理解了索引的原理,我們先來看一下單錶的查詢。
表結構如下:
create table single_table (
id int not null auto_increment,
key1 varchar(100),
key2 int,
key3 varchar(100),
key_part1 varchar(100),
key_part2 varchar(100),
key_part3 varchar(100),
common_field varchar(100),
primary key (id),
key idx_key1 (key1),
unique key idx_key2 (key2),
key idx_key3 (key3),
key idx_key_part(key_part1, key_part2, key_part3)
) engine=innodb charset=utf8;
const
select * from single_table where id = 1438;
id是聚簇索引
select * from single_table where key2 = 3841;
refselect * from single_table where key1 = 'abc
ref_or_null
select * from single_table where key1 = 'abc' or key1 is null;
range
select * from single_table where key2 in (1438, 6328) or (key2 >= 38 and key2 <= 79);
index
看下邊這個查詢:
select key_part1, key_part2, key_part3 from single_table where key_part2 ='abc';
由於key_part2並不是聯合索引idx_key_part最左索引列,所以我們無法使用ref或者range訪問方法來執行這個語句。但是這個查詢符合下邊這兩個條件:
它的查詢列表只有3個列:key_part1, key_part2, key_part3,而索引idx_key_part又包含這三個列。
搜尋條件中只有key_part2列。這個列也包含在索引idx_key_part中。
也就是說我們可以直接通過遍歷idx_key_part索引的葉子節點的記錄來比較key_part2 = 'abc'這個條件是否成立,把匹配成功的二級索引記錄的key_part1, key_part2, key_part3列的值直接加到結果集中就行了。由於二級索引記錄比聚簇索記錄小的多(聚簇索引記錄要儲存所有使用者定義的列以及所謂的隱藏列,而二級索引記錄只需要存放索引列和主鍵),而且這個過程也不用進行回表操作,所以直接遍歷二級索引比直接遍歷聚簇索引的成本要小很多,設計mysql的大叔就把這種採用遍歷二級索引記錄的執行方式稱之為:index。
all全表掃瞄
多個表查詢
乙個表查詢使用索引飛快,那麼如果是多個表呢,先說兩個表吧。
如果沒有任何條件,兩個表關聯查詢要進行連線,正常情況是笛卡爾積。鏈結的數量是兩個表數量的乘積,這是非常可怕的數字,所以我們一般都會增加where過濾條件,這樣就會減少鏈結的數量,具體是怎麼實現的。
是不是聽過大表驅動小表。 當兩個表關聯時,有乙個表是驅動表,從驅動表取出所有n條資料,要拿著這n條的每一條去被驅動表查詢資料,所以關聯的數量是 驅動表篩選出的資料 * 被驅動表的數量,如果被驅動表很大,這個速度就很慢了,所以儘量減少被驅動表的數量還是有必要的。
但是被驅動表的查詢如果能用上索引就很快了,所以關聯條件最好與索引,這樣可以極大的提高效率。
這樣查詢的時候,驅動表的資料使用索引,掃瞄少量資料快速定位, 被驅動表使用驅動表的資料,按照索引,快速搜尋出資料, 兩次的資料量都很少,這樣就能提高查詢效率。
資料庫mysql軟體安裝 資料庫軟體mysql安裝
2.解壓至欲安裝的目錄下 3.開啟cmd,進入軟體目錄下d qmdownload mysql 5.7.24 winx64 bin,執行mysqld 4.初始化使用者 cmd d qmdownload mysql 5.7.24 winx64 bin,執行mysqld initialize insecu...
mysql資料庫之python鏈結mysql
使用之前請在命令列pip install pymysql import pymysql 1.建立鏈結 conn pymysql.connect host 127.0.0.1 ip位址 port 3306,埠號 database database name 資料庫名稱 user mysql usern...
mysql資料庫查詢作業 mysql資料庫查詢練習
建立四張資料表 學生表student 學號,姓名,性別,出生年月日,所在班級 課程表course 課程號,課程名,教師編號 成績表score 學號,課程號,成績 教師表teacher 教師編號,教師名,教師性別,出生年月日,職稱,所在部門 新增資訊 學生表 insert into student v...