MYSQL索引和權限管理


              索引

 

  可以理解為: 搜索引導,索引是一個特殊的數據結構,其存儲的是數據的關鍵信息與詳細信息的位置對應關系

  例如:書本的目錄

      創建索引的語法:

​	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開始

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM