Python MySQL(索引的使用補充)

2022-08-21 23:12:15 字數 4274 閱讀 2697

索引

作用

索引普通索引:加速查詢

主鍵索引:加速查詢 + 不能為空 + 不能重複

唯一索引:加速查詢 + 不能重複 

聯合索引 (聯合唯一索引)

聯合主鍵索引(多列聯合起來作為主鍵索引)

聯合唯一索引(多列聯合起來作為唯一索引)

聯合普通索引

加速查詢(索引就像乙個目錄一樣,如果沒有目錄就要從頭到尾看一遍)無索引:從前到後依次查詢

索引:會建立乙個額外檔案,如果查詢時,先到額外檔案茶,查到了再到資料庫裡找  

索引種類

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的表,其中有...