1. 程式人生 > >資料庫索引與多表聯查

資料庫索引與多表聯查

2. 索引不會包含有NULL值的列

只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在資料庫設計時不要讓欄位的預設值為NULL。

3. 使用短索引

對串列進行索引,如果可能應該指定一個字首長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和I/O操作。

4. 索引列排序

MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;儘量不要包含多個列的排序,如果需要最好給這些列建立複合索引。

5. like語句操作

一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。

經過實際的測試發現 只要在    " %* ",在前面加了 % 就會導致索引不可使用.

1

6. 不要在列上進行運算

例如:select * from users where YEAR(adddate)<2007,將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成:select * from users where adddate<’2007-01-01′。關於這一點可以圍觀:一個單引號引發的MYSQL效能損失。

最後總結一下,MySQL只對一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的 like(不以萬用字元%或_開頭的情形)。而理論上每張表裡面最多可建立16個索引,不過除非是資料量真的很多,否則過多的使用索引也不是那麼好玩的,比 如我剛才針對text型別的欄位建立索引的時候,系統差點就卡死了。

MySQL儲存引擎--MyISAM

特點

1.不支援事務: MyISAM 儲存引擎不支援事務,所以對事務有要求的業務不能使用

2.表級鎖定: 鎖定機制是表級索引,鎖定的實現成本小,但也大大降低了其併發效能

3.讀寫互相阻塞: 寫入阻塞讀取,MyISAM 讀取的時候阻塞寫入,讀本身不會阻塞另外的讀

4.只會快取索引:

通過 key_buffer快取以大大提高訪問效能減少磁碟IO,但是快取區只會快取索引,不會快取資料.

MySQL 儲存引擎--InnoDB

特性:

1.支援事務,4個事務的隔離級別

2.讀寫阻塞與事務隔離級別相關

3.具有非常高效的快取特性:能快取索引,也能快取資料

4.整個表和主鍵以Cluster方式儲存,組成一顆平衡樹

5.所有Secondary Index都會儲存主鍵資訊

事務的演示:

--  演示資料回滾  資料恢復 刪除無效 ...

-- 1: 開啟事務  

start transaction;

delete from employee where id  = 3;

--  事務回滾

rollback;

MySQL的多表聯查 使用中間表\

多對多關係表  建立一箇中間表 ,使用聯合主鍵,快速查詢資料

建立第三張關係表,在關係表中引用兩個實體主鍵作為外來鍵

通過關鍵字constraint主鍵約束  references參照

alter table 中間表名 add constraint 外表名_中間表名_fk foreign key(中間表對應外表的列) references 外表名(對應的列);