裝飾器
原理:閉包。
所謂閉包就是在一個内部函數裡,對外部作用域變量(但不是全局作用域)的變量進行引用。這樣内部函數就會被認為是閉包(closure)
1.簡單裝飾器
def my_logging(func):
def wrapper(*args, **kwargs):
print("{} is running".format(func.__name__))
return func(*args, **kwargs)
return wrapper
def foo(x, y):
print("this is foo function")
return x + y
foo = my_logging(foo)
foo()
或者
@my_logging
def foo():
print("this is foo function")
"""
result:
foo is running
this is foo function
"""
2.帶參數的裝飾器
此時需要三層的裝飾器,一個傳裝飾器的參數,一個傳裝飾的函數,一個傳函數的參數
def my_logging_level(level):
def decorator(func):
def wrapper(*args, **kwargs):
if level == 'info':
print('level is info')
else:
print('level is other levels')
return func(*args, **kwargs)
return wrapper
return decorator
@my_logging_level('info')
def a_foo(name="foo"):
print("{} is running".format(name))
a_foo()
"""
result:
level is info
foo is running
"""
3.類裝飾器
類裝飾器主要依靠類的
__call__
方法
class MyLogging:
def __init__(self, func):
self._func= func
def __call__(self, *args, **kwargs):
print("class decorator starting.")
a = self._func(*args, **kwargs)
print("class decorator end.")
return a
@MyLogging
def c_foo(name="foo"):
print("{} is running".format(name))
c_foo()
"""
result:
class decorator starting.
foo is running
class decorator end.
"""
生成器
實作的方式:yield
事務
四個特性(ACID):
原子性(Atomicity)**:**操作這些指令時,要麼全部執行成功,要麼全部不執行。隻要其中一個指令執行失敗,所有的指令都執行失敗,資料進行復原,回到執行指令前的資料狀态。
一緻性(Consistency)**:**事務的執行使資料從一個狀态轉換為另一個狀态,但是對于整個資料的完整性保持穩定。
隔離性(Isolation)**:**隔離性是當多個使用者并發通路資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個并發事務之間要互相隔離。即要達到這麼一種效果:對于任意兩個并發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在并發地執行。
持久性(Durability)**:**當事務正确完成後,它對于資料的改變是永久性的。
資料庫事務的隔離級别
事務的隔離級别有4種,由低到高分别為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的并發操作中可能會出現髒讀,不可重複讀,幻讀。
詳細參考https://www.cnblogs.com/Kevin-ZhangCG/p/9038371.html
聯合索引
a,b 兩個字段的索引支援b,a查詢麼
兩個或更多個列上的索引被稱作聯合索引,聯合索引又叫複合索引。對于複合索引:Mysql從左到右的使用索引中的字段,一個查詢可以隻使用索引中的一部份,但隻能是最左側部分。例如索引是key index (a,b,c). 可以支援a | a,b| a,b,c 3種組合進行查找,但不支援 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效。
什麼情況下使用索引
【1】為了快速查找比對WHERE條件的行。
【2】為了從考慮的條件中消除行。
【3】如果表有一個multiple-column索引,任何一個索引的最左字首可以通過使用優化器來查找行。
【4】查詢中與其它表關聯的字,字段常常建立了外鍵關系
【5】查詢中統計或分組統計的字段
索引注意事項
1,建立索引
對于查詢占主要的應用來說,索引顯得尤為重要。很多時候性能問題很簡單的就是因為我們忘了添加索引而造成的,或者說沒有添加更為有效的索引導緻。如果不加
索引的話,那麼查找任何哪怕隻是一條特定的資料都會進行一次全表掃描,如果一張表的資料量很大而符合條件的結果又很少,那麼不加索引會引起緻命的性能下降。但是也不是什麼情況都非得建索引不可,比如性别可能就隻有兩個值,建索引不僅沒什麼優勢,還會影響到更新速度,這被稱為過度索引。
2,複合索引
比如有一條語句是這樣的:select * from users where area=’beijing’ and age=22;
如果我們是在area和age上分别建立單個索引的話,由于mysql查詢每次隻能使用一個索引,是以雖然這樣已經相對不做索引時全表掃描提高了很多效率,但是如果在area、age兩列上建立複合索引的話将帶來更高的效率。如果我們建立了(area, age,salary)的複合索引,那麼其實相當于建立了(area,age,salary)、(area,age)、(area)三個索引,這被稱為最佳左字首特性。
是以我們在建立複合索引時應該将最常用作限制條件的列放在最左邊,依次遞減。
3,索引不會包含有NULL值的列
隻要列中包含有NULL值都将不會被包含在索引中,複合索引中隻要有一列含有NULL值,那麼這一列對于此複合索引就是無效的。是以我們在資料庫設計時不要讓字段的預設值為NULL。
4,使用短索引
對串列進行索引,如果可能應該指定一個字首長度。例如,如果有一個CHAR(255)的 列,如果在前10 個或20 個字元内,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
5,排序的索引問題
mysql查詢隻使用一個索引,是以如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。是以資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立複合索引。
6,like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引,而like “aaa%”可以使用索引。
7,不要在列上進行運算
8,不使用NOT IN操作
NOT IN操作不會使用索引将進行全表掃描。NOT IN可以用NOT EXISTS代替
浏覽器輸入網址請求過程
詳見https://blog.csdn.net/qq_38950316/article/details/81087809