採用索引去訪問記錄的話,那首先需訪問索引表,再通過索引表訪問資料表,一般索引表與資料表不在同乙個資料塊,這種情況下oracle至少要往返讀取資料塊兩次。
表名_欄位名1.需要加索引的字段,在where條件中;
2.數量少的字段不需要加索引;
3.如果where條件中為or關係,加索引不起作用;
4.符合最左原則:對於復合索引,應將最常用作限制條件的列放在最左邊,依次遞減;
注:mysql查詢只能使用乙個索引,若where子句中已經使用了索引的話,那order by中的列是不使用索引的。1.表的主關鍵字:自動建立唯一索引;
2.表的字段唯一屬性:oracle利用索引來保證資料的完整性;
3.直接條件查詢的字段:sql中用於條件約束的字段;
4.查詢中與其他表關聯的字段:欄位外來鍵關係;
5.查詢中排序的字段:提高排序速度;
6.查詢中統計或分組統計的字段。
1.表記錄太少;
2.經常插入、修改、刪除的表;
3.資料重複且分布平均的表字段;
4.經常和主欄位一塊查詢但主字段索引值比較多的表字段。
1.建立索引時,若欄位名對應值太少,可不建索引,例如:性別;
2.索引不會包含有null值的列:復合索引中如有乙個為null,則該索引無效;
3.使用短索引:對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的 列,如果在前10 個或20 個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作;
4.like語句操作:不鼓勵使用,若必用:like 「%aaa%」 不會使用索引而like 「aaa%」可以使用索引;
5.列上不進行運算;
6.不適應not in 和操作:not in和操作都不會使用索引將進行全表掃瞄。not in可以not exists代替。
如果是組合索引,則列值的組合必須唯一。
1.primary key = unique+not nullinsert ignore會忽略資料庫中已經存在的資料(根據主鍵或者唯一索引判斷),如果資料庫沒有資料,就插入新的資料,如果有資料的話就跳過這條資料。2.唯一性約束所在的列允許空值,但是主鍵約束所在的列不允許空值。
3.可以把唯一性約束放在乙個或者多個列上,這些列或列的組合必須有唯一的。但是,唯一性約束所在的列並不是表的主鍵列。
4. 唯一性約束強制在指定的列上建立乙個唯一性索引。在預設情況下,建立唯一性的非聚簇索引,但是,也可以指定所建立的索引是聚簇索引。
5.建立主鍵的目的是讓外來鍵來引用。
6.乙個表最多只有乙個主鍵,但可以有很多唯一鍵。
注:主鍵自動增長。1.replace into 首先嘗試插入資料到表中。 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料,否則,直接插入新資料。
2.使用replace into,你必須具有delete和insert許可權。
1.如果在insert into 語句末尾指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key**現重複值,則在出現重複值的行執行update;如果不會導致重複的問題,則插入新行,跟普通的insert into一樣。
2.使用insert into,你必須具有insert和update許可權。
3.如果有新記錄被插入,則受影響行的值顯示1;如果原有的記錄被更新,則受影響行的值顯示2;如果記錄被更新前後值是一樣的,則受影響行數的值顯示0。
注:主鍵自動增長
死鎖產生insert … on duplicate key 在執行時,innodb引擎會先判斷插入的行是否產生重複key錯誤,
如果存在,在對該現有的行加上s(共享鎖)鎖,如果返回該行資料給mysql,然後mysql執行完duplicate後》的update操作,然後對該記錄加上x(排他鎖),最後進行update寫入。如果有兩個事務併發的執行同樣》的語句,那麼就會產生death lock。
解決方法
1、盡量對存在多個唯一鍵的table使用該語句;
2、在有可能有併發事務執行的insert 的內容一樣情況下不使用該語句。
1.這三種方法都能避免主鍵或者唯一索引重複導致的插入失敗問題。2.insert ignore能忽略重複資料,只插入不重複的資料。
3.replace into和insert … on duplicate key update,都是替換原有的重複資料,區別在於replace into是刪除原有的行後,在插入新行,如有自增id,這個會造成自增id的改變;insert … on duplicate key update在遇到重複行時,會直接更新原有的行,具體更新哪些字段怎麼更新,取決於update後的語句。
mysql索引之聚集索引
聚集索引不是一種單獨的索引型別,而是一種儲存資料方式。其具體細節依賴於實現方式,但是innodb的聚集索引實際上在同樣的結構中儲存了b tree索引和資料行。當表有聚集索引的時候,它的資料行實際儲存在索引的葉子頁中。術語 聚集 指實際的資料行和相關的鍵值都儲存在一起。每個表只能有乙個聚集索引,因為不...
mysql索引 之覆蓋索引
今天參考了 高效能mysql 與幾篇博文,總結一下我個人的對覆蓋索引的理解。首先,覆蓋索引並不是一種新的資料結構,它的意思是在查詢的時候,利用到的索引已經完全包含需要查詢欄位的情況,在這種情況下,查詢結果直接就是索引的值,並不需要再利用索引回表查詢了。繼續拿sakila資料庫 mysql安裝好後自帶...
mysql索引之雜湊索引
雜湊演算法時間複雜度為o 1 且不只存在於索引中,每個資料庫應用中都存在該資料結構。雜湊表也為雜湊表,又直接定址改進而來。在雜湊的方式下,乙個元素k處於h k 中,即利用雜湊函式h,根據關鍵字k計算出槽的位置。函式h將關鍵字域對映到雜湊表t 0.m 1 的槽位上。上圖中雜湊函式h有可能將兩個不同的關...