索引
可以理解為: 搜索引導,索引是一個特殊的數據結構,其存儲的是數據的關鍵信息與詳細信息的位置對應關系
create index 索引的名字 on 表名稱(字段名) 聯合索引 create index 索引的名字 on 表名稱(字段名,字段名) create index union_index on usr(id,email,name,gender); 刪除索引: drop index 索引名稱 on 表名稱;
磁盤IO
平均 查找一個數據需要花費至少9ms 這段是CPU 就會切換到其他的程序 ,
我們要加速查詢,必須較少io操作的次數
b+樹
在b+樹中 葉子節點才是存儲真實數據的,葉子數量越多,樹的層級越高,導致IO次數增加
要避免這個問題,在葉子節點中盡可能的存儲更多的數據, 應該將數據量小的字段作為索引
當b+樹的數據項是復合的數據結構,比如(name,age,sex)的時候(多字段聯合索引),b+樹會按照從左到右的順序來建立搜索樹,比如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最后得到檢索的數據;但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜索樹的時候name就是第一個比較因子,必須要先根據name來搜索才能知道下一步去哪里查詢。比如當(張三,F)這樣的數據來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等於張三的數據都找到,然后再匹配性別是F的數據了, 這個是非常重要的性質,即索引的最左匹配特性。
聚集索引
聚集索引中包含了所有字段的值,如果擬制定了主鍵,主鍵就是聚集索引,如果沒有則找一個非空且唯一的字段作為聚集索引,如果也找不着,自動生成一個字段作為聚集索引
聚集索引中存儲了所有的數據
輔助索引
除了聚集索引以外的都叫做輔助索引
輔助索引中只包含當前的索引字段和主鍵的值
覆蓋查詢
指得是在當前索引結構中就能找到所有需要的數據 ,如果使用的是聚集索引來查詢那么一定覆蓋查詢,速度是最快的
回表查詢
指得是在當前索引結構中找不到所需的數據,需要通過id 去聚集索引中查詢 ,速度慢與聚集索引
用戶管理
主要為了控制權限,讓不同開發者,僅能操作屬於自己的業務范圍內的數據
創建myqsl賬戶
賬戶中涉及的三個數據
賬戶名 密碼 ip地址
ip是用於限制某個賬戶只能在那些機器上登錄
create user 用戶名@主機地址 identified by "密碼"; # 注意:操作用戶 只能由root賬戶來進行 # 刪除 將同時刪除所有權限 drop user 用戶名@主機地址;
權限管理
涉及到的表
user 與用戶相關信息 db用戶的數據庫權限信息 tables_priv 用戶的表權限 columns_priv 用戶的字段權限
語法
grant all on *.* to 用戶名@主機地址 identified by "密碼"; # 如果用戶不存在則自動創建新用戶,推薦使用 grant all on *.* to rose@localhost identified by "123"; grant all on day42.* to rose1@localhost identified by "123"; grant all on day42.table1 to rose2@localhost identified by "123"; grant select(name),update(name) on day42.table1 to rose3@localhost identified by "123"; all表示的是對所有字段的增刪改查 *.* 所有庫的所有表 收回權限 revoke all on *.* from 用戶名@主機地址; revoke all on day42.table1 from rose2@localhost; # 刷新權限 flush privileges; #with grant option 表示 可以將他擁有的權限授予其它的用戶 grant all on *.* to root1@localhost identified by "123" with grant option; # 授予某個用戶 可以在任何主機上登錄 grant all on *.* to jack10@"%" identified by "123"; grant all on *.* to jack10@localhost identified by "123";
pymysql
pymysql 是一個第三方模塊,幫我們封裝了,建立連接,用戶認證,sql'的執行以及,結果的獲取
基本使用
import pymysql """ 1.連接服務器 2.用戶認證 3.發送指令 4.提取結果 """ # 1. 連接服務器 獲取連接對象(本質上就是封裝號的socket) conn = pymysql.connect( host = "127.0.0.1", #如果是本機 可以忽略 port = 3306, # 如果沒改過 可以忽略 user = "root", #必填 password = "111", #必填 database = "day42" #必填 ) # 2.通過連接拿到游標對象 # 默認的游標返回的是元組類型 不方便使用,需要更換字典類型的游標 c = conn.cursor(pymysql.cursors.DictCursor) # 3.執行sql sql = "select * from table1" res = c.execute(sql) # 查詢語句將返回查詢的結果數量 # 4.提取結果 # print(res) # print(c.fetchall()) # 5.關閉連接 c.close() conn.close() # 移動光標 參數1位移動的位置 mode 指定 相對或絕對 # c.scroll(1,mode="absolute") # print(c.fetchall()) # print(c.fetchmany(1)) print(c.fetchone()) print(c.fetchone())
修改數據
案例:
import pymysql conn = pymysql.connect( host = "127.0.0.1", #如果是本機 可以忽略 port = 3306, # 如果沒改過 可以忽略 user = "root", #必填 password = "111", #必填 database = "day42", #必填, #autocommit=False # 開啟自動提交 不常用.... ) c = conn.cursor(pymysql.cursors.DictCursor) name = input("name:") pwd = input("pwd:") sql = "select *from user where name = %s" if c.execute(sql,(name,)): print("用戶名已存在!") else: sql2 = "insert into user values(%s,%s)" if c.execute(sql2,(name,pwd)): print("注冊成功!") conn.commit() # 調用連接對象的提交函數 else: print("注冊失敗!") c.close() conn.close()
# 創建名為add1的存儲過程 delimiter | create procedure add1(in a int,in b int,out c int) begin set c = a + b; end| delimiter ; #pymysql中調用 import pymysql conn = pymysql.connect( host = "127.0.0.1", #如果是本機 可以忽略 port = 3306, # 如果沒改過 可以忽略 user = "root", #必填 password = "111", #必填 database = "day42", #必填, autocommit=True # 開啟自動提交 不常用.... ) c = conn.cursor(pymysql.cursors.DictCursor) c.callproc("add1",(1,2,1212)) # @_add1_0 @_add1_1 @_add1_2 c.execute("select @_add1_2") print(c.fetchone()) # 調用存儲過程時,傳入參數,會自動定義成變量, # 命名方式 @_過程的名稱_參數的索引 從0開始