索引
作用
索引普通索引:加速查詢
主鍵索引:加速查詢 + 不能為空 + 不能重複
唯一索引:加速查詢 + 不能重複
聯合索引 (聯合唯一索引)
聯合主鍵索引(多列聯合起來作為主鍵索引)
聯合唯一索引(多列聯合起來作為唯一索引)
聯合普通索引
加速查詢(索引就像乙個目錄一樣,如果沒有目錄就要從頭到尾看一遍)無索引:從前到後依次查詢
索引:會建立乙個額外檔案,如果查詢時,先到額外檔案茶,查到了再到資料庫裡找
索引種類
hash索引:把內容轉換成hash值,把它的值和在資料庫的位址儲存成乙個表,但位置和原來資料庫的資料位置不同
優點:查詢單值時非常快
缺點:不能按範圍查詢,如果想要按id查到,但hash索引位置不固定就不能查詢出來
btree索引:
把資料轉換成數字然後放進二叉樹中,假如是1024不需要從1查到1024查1024次,只需要2**10,查詢10次
建立索引:
額外的檔案儲存特殊的資料結構
查詢快;插入更新刪除慢,因為在資料庫和索引中同時改動
命中索引,建立索引並使用了索引
select * from userinfo where name = '小明'; 快
select * from userinfo where name like '小明'; 慢
主鍵一般建立表的時候都會建立
普通索引:
create index 索引名稱 on 表(列名)
能建立就能刪除 drop index 索引名稱 on 表;
唯一索引:(建立表的時候也能建立)
create unique index 索引名稱 on 表(列名)
drop unique index 索引名稱 on 表;
聯合索引:(普通聯合索引和唯一聯合索引)
create (unique) index 索引名稱 on 表(列名,列名)
drop (unique) index 索引名稱 on 表;
最左字首匹配:
create index 索引名稱 on 表(id,name) ;
select * from userinfo where id = 9;
select * from userinfo where name = '小明';
select * from userinfo where id = 9 and name = '小明'; # 前三種都會使用索引
select * from userinfo where name='小明' and id = 9; # 最後一種不是使用索引
# 假如列名有abc三種 a、b、c、ab、ac、bc都會使用索引ba、cb、ca之類的都不都會使用索引,以此類推
組合索引效率>索引合併,但索引合併比較靈活,看情況使用
覆蓋索引:(不是真的索引,是一種專有名詞)
select id from t1i where id = 9; (假設id已經建立了索引)
這不同於 * from 從資料表中查詢, id from 是直接在硬碟中建立的那個id索引檔案中找條件id
索引合併:(也不是真的索引,是一種專有名詞)
把多個單列索引合併使用
select * from t1 where id = 9 and name = '小明' ; (假設id和name都建立了索引)
這樣同時使用兩個單列索引的方法就叫索引合併
索引的注意點:頻繁使用的列表才建立索引,否則平時的插入更新刪除會變慢
如果資料被頻繁查詢到最好別用 like 來查詢,最好用第三方工具來查詢
比如資料是
iddate
1英國**表示,不會提前宣布進行全國隔離,因為會導致英國民眾隔離「行為疲勞
2這樣同時使用兩個單列索引的方法就叫索引合併
3英國**表示,不會提前宣布進行全國隔離,因為會導致英國民眾隔離「行為疲勞
id 1,3 資料date內容都是:英國**表示,不會提前宣布進行全國隔離,因為會導致英國民眾隔離「行為疲勞」。)like查詢就是 select * from t1 where date like '%英國**%' ; (比較慢)
而第三方工具 會把建立乙個檔案解析內容把「英國**」,「全國隔離」,「行為疲勞」 記錄到 id 1,3然後select * from t1 where id in (1,3);
盡量不要使用函式來運算元據庫(如翻轉),不然會改變儲存資料的方式,如果想要修改顯示的方式可以在python中修改顯示
select * from t1 where reverse(name) = '小明':
or(假設id和name有索引)select * from t1 where id = 9 or title = '時間'; (假設id有索引,title沒有索引,查詢也會很慢)
但是如果select * from t1 where id = 9 or title='時間' and name = '小明' (但是如果是這樣就會用id和name進行索引,跳過title)
查詢時的資料型別要和列型別一樣,不然搜尋時也會變慢
假如 name 列是 char 型別,如果用 select * from t1 where name = 9; 就會很慢
避免使用select *
count(1)或者count(列名)來代替count(*)
建立表時盡量用char來代替char
表的字段順序固定長度的字段優先
組合索引代替多個單列索引(如果經常用到的話)
盡量使用短索引:比如都是9位數字的郵箱就可以只取前幾位來建立索引,create index xx on t1(title(9))
使用連線(join)來代替子查詢
連表時注意條件型別要一致
索引雜湊值(重複少)不適合建立索引,比如:性別 就不合適
雖然索引有這麼多規矩,但最終判斷命中索引的正確還是要通過時間,時間短才是王道。
不過也不能每次都執行語句來檢測每乙個的時間,然後在判斷哪個時間短,所以就要用到乙個工具mysql自帶的執行計畫:讓mysql預估執行操作的時間(一般是正確的)
explain select * from t1;
查詢出來有個type,它說明sql語句是用什麼方式訪問表的,有以下幾種方式,一般是通過訪問方式來判斷語句的查詢速度
效能排序為 allall: 全表掃瞄,把資料表從頭到尾找一遍 如:select * from t1;
但是也有特例,如limit explain select * from t1 limit 1;
# 這個的訪問型別也是all 但是它的執行速度也很快,因為他如果找到了所要的資料就不繼續掃瞄了,所以訪問方式也只是做個參考
index:全索引掃瞄,對索引從頭到尾找一遍 如:select id from t1;
rande:對索引列進行範圍查詢 如 select * from t1 where id = 9;
index_merge :合併索引,使用多個單列索引搜尋 如:select * from t1 where id = 9 or name = '小明';
ref:根據索引查詢乙個或多個值 如 : select * from t1 where name = '小明'
eq_ref:
連線時使用primary key 或 unique型別
const:常量(表最多有乙個匹配行,因為僅有一行,在這行的列值可以被優化器剩餘部分認為是常數,const表很快,因為它們只讀取一次)如:select id from t1 where id = 2;
system:系統(表只有一行=系統表。這是const聯接型別的乙個特例) 如:select * from (select id from t1 where id = 2) as a;
python mysql 事務 索引
1事務的四大特性 acid 原子性 一致性 隔離性 永續性 銀行轉賬例子 原子性 每乙個事務都是乙個不可分割的最小單元 一致性 乙個事務從乙個一致性狀態轉換成另乙個一致性狀態 隔離性 乙個事務所做的修改另乙個事務是看不見的。永久性 一旦乙個事務commit提交了資料,資料將永久儲存。2.事務過程 1...
Python Mysql 事務 索引
事務就是使用者定義的一系列執行sql語句的操作,這些操作要麼完全地執行,要麼完全地都不執行,它是乙個不可分割的工作執行單元。事務的使用場景 在日常生活中,有時我們需要進行銀行轉賬,這個銀行轉賬操作背後就是需要執行多個sql語句,假如這些sql執行到一半突然停電了,那麼就會導致這個功能只完成了一半,這...
python MySQL的常用操作
1.建立庫,表 建庫 create database 庫名 建表 create table 表名 列名 資料型別 位數 not null 如 create table student id int 10 not null,name varchar 10 此處為建立乙個名字為student的表,其中有...