Mysql 索引設計的原則, 髒讀,幻讀

Mysql 索引設計的原則mysql

索引設計的原則?
1.適合索引的列是出如今where子句中的列,或者鏈接子句中指定的列
2.基數較小的類,索引效果較差,沒有必要在此列創建索引
3.使用短索引,若是對長字符串列進行索引,應該指定一個前綴長度,這樣可以節省大量索引空間
4.不要過分索引。索引須要額外的磁盤空間,並下降寫操做的性能。在修改表內容的時候,索引會進行更新甚至重構,索引列越多,這個時間就會越長。因此只保持須要的索引有利於查詢便可。

2. 建立索引的原則(重中之重)
索引雖好,但也不是無限制的使用,最好符合一下幾個原則sql

1) 最左前綴匹配原則,組合索引很是重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就中止匹配,好比a = 1 and b = 2 and c > 3 and d = 4 若是創建(a,b,c,d)順序的索引,d是用不到索引的,若是創建(a,b,d,c)的索引則均可以用到,a,b,d的順序能夠任意調整。數據庫

2)較頻繁做爲查詢條件的字段纔去建立索引ide

3)更新頻繁字段不適合建立索引函數

4)如果不能有效區分數據的列不適合作索引列(如性別,男女未知,最多也就三種,區分度實在過低)性能

5)儘可能的擴展索引,不要新建索引。好比表中已經有a的索引,如今要加(a,b)的索引,那麼只須要修改原來的索引便可。優化

6)定義有外鍵的數據列必定要創建索引。設計

7)對於那些查詢中不多涉及的列,重複值比較多的列不要創建索引。索引

8)對於定義爲text、image和bit的數據類型的列不要創建索引。事務

3。 建立索引時須要注意什麼?
非空字段:應該指定列爲NOT NULL,除非你想存儲NULL。在mysql中,含有空值的列很難進行查詢優化,由於它們使得索引、索引的統計信息以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值;
取值離散大的字段:(變量各個取值之間的差別程度)的列放到聯合索引的前面,能夠經過count()函數查看字段的差別值,返回值越大說明字段的惟一值越多字段的離散程度高;
索引字段越小越好:數據庫的數據存儲以頁爲單位一頁存儲的數據越多一次IO操做獲取的數據越大效率越高。

聚簇索引:將數據存儲與索引放到了一塊,找到索引也就找到了數據

4.什麼是髒讀?幻讀?不可重複讀?
髒讀(Drity Read):某個事務已更新一份數據,另外一個事務在此時讀取了同一份數據,因爲某些緣由,前一個RollBack了操做,則後一個事務所讀取的數據就會是不正確的。
不可重複讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這多是兩次查詢過程當中間插入了一個事務更新的原有的數據。
幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例若有一個事務查詢了幾列(Row)數據,而另外一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

5.死鎖是指兩個或多個事務在同一資源上相互佔用,並請求鎖定對方的資源,從而致使惡性循環的現象

相關文章
相關標籤/搜索