日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MYSQL数据库索引设计的原则

發(fā)布時間:2023/12/10 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MYSQL数据库索引设计的原则 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

索引說明

InnoDB是使用B+樹來實現(xiàn)其索引功能的。在B+樹中,內(nèi)節(jié)點(非葉子節(jié)點)存儲了行數(shù)據(jù)的鍵,而葉子節(jié)點存儲了所有的行數(shù)據(jù),而B樹的每個節(jié)點都存儲了真實的數(shù)據(jù)。這種數(shù)據(jù)結(jié)構(gòu),決定了兩者有以下不同點:

(1)非葉子節(jié)點能存放指針的數(shù)據(jù)量。因為B樹的非葉子節(jié)點存放的是整行的數(shù)據(jù),占用了較多的空間,所以能存放指針就相對較少,因此整個B樹的層數(shù)就變高。當(dāng)數(shù)據(jù)量比較大時,插入更新會導(dǎo)致維護代價也是比較大的,而且層數(shù)越高,搜索的性能就會越低。而B+樹的內(nèi)節(jié)點存放的是相對短很多的鍵值,就克服了B樹遇到的問題。

(2)從數(shù)據(jù)結(jié)構(gòu)上來看,B樹的查詢效率與數(shù)據(jù)所在的位置有關(guān)。即如果所要搜索的數(shù)據(jù)節(jié)點,在樹上的位置,越靠近根節(jié)點,查詢返回結(jié)果越快,最差的就是數(shù)據(jù)位于葉子節(jié)點上,不同的節(jié)點位置,其性能不均衡;而B+樹,完整的數(shù)據(jù)都是在葉子節(jié)點上,其查詢效率是固定的。插入、刪除操作同樣的原理,在B樹中,其復(fù)雜度明顯增加,而B+樹相對簡單的多。例如,B+樹,在插入過程中,只需要通過在每一層搜索一個節(jié)點,依次找到節(jié)點之后,在節(jié)點處插入即可(節(jié)點滿,則分裂)。

(3)B樹中,所有的數(shù)據(jù)只存儲了一份;而B+樹,除了存儲了所有數(shù)據(jù)的葉子節(jié)點外,還要在內(nèi)節(jié)點存儲了鍵值。所以,在空間占用方面,B+樹會比B樹多些。

(4)在一個表中,聚族索引占用的空間肯定是最大的,因為它存儲了全部數(shù)據(jù),而二級索引是建立在某幾個經(jīng)常查詢的列上(還有用來“回表”的指針),所以,二級索引的占用空間都會比聚族索引小很多。

索引設(shè)計原則

(1)MySQL 表主鍵設(shè)計

INNODB 以主鍵排序存儲;聚集索引只能是主鍵;存儲所有數(shù)據(jù);二級索引包含主鍵鍵值。

如果表沒有定義主鍵,會選擇第一個唯一索引(非空)作為聚集索引主鍵。如果唯一索引也沒有,MySQL后臺會自動生成RowID。

字符類型字段最好不要做主鍵;常見的主鍵有兩種:自增列和UUID。

自增:? 順序存儲,索引維護成本低,索引效率高;

UUID:非順序增長,隨機IO嚴(yán)重。

(2)索引并不是越多越好,要根據(jù)查詢,有針對性的創(chuàng)建,考慮在WHERE和ORDER BY命令上涉及的列建立索引,可根據(jù)EXPLAIN來查看是使用了索引還是全表掃描;

(3)應(yīng)盡量避免在WHERE子句中對字段進行NULL值判斷,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描;

(4)值分布很稀少的字段不適合建索引,例如“性別”這種只有兩三個值的字段;

(5)不用外鍵,由程序保證約束;

(6)盡量不用UNIQUE,由程序保證約束;

(7)使用多列索引時主意順序和查詢條件保持一致,同時刪除不必要的單列索引。

(8)排序時,排序字段需要注意index, 尤其是關(guān)聯(lián)查詢排序時,盡可能使用小表的字段進行排序

SQL 優(yōu)化 原則

(1)避免屬性隱試轉(zhuǎn)換 , 如定義Moblie varchar? where Moblie =198989888會導(dǎo)致全表掃描;

(2)Where子句中條件字段本身避免使用函數(shù);

(3)使用獲取的必要字段代替SELECT *;

(4)批量插入,使用INSERT INTO table (col1,col2,...) VALUES (value1, value2,...),(value1, value2,...); 插入多條數(shù)據(jù)只有一次提交;

(5)避免使用長事務(wù);

(6)禁止負(fù)向查詢: NOT、!=、<>、!<、!>、NOT IN、NOT LIKE,會導(dǎo)致全表掃描;

(7)大表之間的join,盡量縮小結(jié)果集之后再join,否則會消耗較多的內(nèi)存和CPU;

(8)搜索嚴(yán)禁左模糊或者全模糊(like %XX, 或like %XX%),會導(dǎo)致全表掃描。


總結(jié)

以上是生活随笔為你收集整理的MYSQL数据库索引设计的原则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。