資料庫索引優化

2021-09-17 03:36:27 字數 3702 閱讀 7270

索引:

`索引的原理是利用特殊的查詢演算法(如二叉樹演算法),限制訪問的行數,提高訪問效率。

索引的分類:

主鍵索引、普通索引、唯一索引、外來鍵索引和全文索引。

檔案:針對於mysql來說

innodb:兩個檔案 .frm(表結構) .ibd(索引檔案)

myisam:三個檔案 .frm(表結構) .myd(表資料) .myi(表索引)

主鍵索引

當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引

普通索引

一般來說,普通索引的建立,是先建立表,然後在建立普通索引

唯一索引

當表的某列被指定為unique約束時,這列就是乙個唯一索引

unique欄位可以為null,並可以有多null,即null!=null。但是如果是具體內容,則不能重複

外來鍵索引

維護表的關聯關係

id name pwd nich

uid email phone dizhi

全文索引

全文索引,只對myisam引擎有用。主要是針對檔案,文字的檢索, 比如文章或者段落,

它會把某個資料表的某個資料列出現過的所有單詞生成乙份清單 【注】mysql自己提供的fulltext針對英文生效,想要搜尋中文需要使用專門的全文檢索引擎或者使用加強版的模糊查詢。

【注】全文索引不完全等同於模糊查詢比如title欄位有這麼個資料』abcd20088ccaa』,

使用模糊查詢select * from articles where title like』%2008%』可以查詢到,而使用全文檢索select * from articles where match(title) against(『2008』);是檢索不到的,因為2008不是乙個單詞!`

索引的新增,刪除和檢視

建立索引 1、alter table方法 alter table用來建立普通索引、unique索引或primary key索引。 alter table table_name add index index_name (column_list) alter table table_name add unique (column_list) alter table table_name add primary key (column_list) 2、create index create index可對表增加普通索引或unique索引。 create index index_name on table_name (column_list) create unique index index_name on table_name (column_list) 刪除索引 可利用alter table或drop index語句來刪除索引。 drop index index_name on talbe_name alter table table_name drop index index_name alter table table_name drop primary key //只能刪除主鍵索引 檢視索引 show index from 表名\g table:表的名稱。 non_unique:如果索引不能包括重複詞,則為0。如果可以,則為1。 key_name:索引的名稱。 seq_in_index:索引中的列序列號,從1開始。 column_name:列名稱。 collation:列以什麼方式儲存在索引中。在mysql中,有值'a'(公升序)或null(無分類)。 全文索引 建立表時新增 create table articles ( id int unsigned auto_increment not null primary key, title varchar(200), body text, fulltext (title,body) )engine=myisam charset=utf8; 建立表後新增 alter table articles add fulltext (title,body); 全文索引的用法 select * from articles where match(title,body) against('要搜尋的單詞');

索引的代價

sql語言共分為四大類:資料查詢語言dql,資料管理語言dml(增刪改),資料定義語言ddl(create),資料控制語言dcl(grant,commit,rollback)。 1、占用磁碟空間 索引是有開銷的,表現在新增索引後.ibd檔案(innodb引擎)或者.myi檔案(myisam引擎)會變大。 2、導致dml操作速度變慢 新增索引後之所以會快,是因為表依據索引對資料按某種演算法(二叉樹等)進行排序,所以刪除、增加、插入後二叉樹要重新排序,導致執行效率降低。 此時要看自己的資料庫是dml語句執行的多還是dql語句執行的多 使用以下語句可以查詢 show status like 'com_select'; show status like 'com_insert'; show status like 'com_delete'; show status like 'com_update'; 一般來說,dql語句操作比dml語句要多得多!接近9:1

什麼情況不使用索引

1、資料唯一性差的字段不要使用索引 比如性別,只有兩種可能資料 2、頻繁更新的字段不要使用索引 比如登入次數,頻繁變化導致索引也頻繁變化,增大資料庫工作量,降低效率。 3、欄位不在where語句出現時不要新增索引 只有在where語句出現,mysql才會去使用索引 4、資料量少的表不要使用索引 使用了沒顯著效果

新增了索引但是沒有被使用

1、多列索引查詢條件沒有使用最左邊的字段,

id, name, email

在sql語句中只要沒有使用最左邊的字段,就不會使用索引

2、如果條件中有or

只要條件中有乙個字段沒有新增索引,則不會使用索引

3、型別不對應

比方說,如果列型別是字串,那一定要在條件中將資料使用引號引用起來。否則不使用索引

4、mysql優化器的決定

如果mysql估計使用全表掃瞄要比使用索引快,則不使用索引

5、like '%aaa'不會使用到索引

只要模糊查詢的模糊值在字串前面,則不會使用索引

解決like不使用索引的方法

1、select主鍵 只要select的字段剛好是主鍵,那麼就會使用到索引(只對innodb資料庫有效) 可以採用分步查詢的方法,先select主鍵再利用主鍵去找其他字段。不過好像比較麻煩 2、覆蓋索引法 覆蓋索引是一種特殊的多列索引,當多列索引指向乙個查詢語句中所有的字段時,該多列索引就被稱為覆蓋索引。 create index index_name_age on user(name,age); 建立覆蓋索引 explain select name,age from user where name like '_1'\g 這時候發現使用索引了 【注】當覆蓋索引指向的字段是varchar(380)及380以上的字段時,覆蓋索引會失效! 3、全文索引法 此方法有較大侷限。 全文索引,只對myisam引擎有用。主要是針對對檔案,文字的檢索,比如文章或者段落 它會把某個資料表的某個資料列出現過的所有單詞生成乙份清單 少於3個字元的單詞不會被包含在全文索引裡,可以通過修改my.cnf修改選項 ft_min_word_len=3 但是! 全文索引不完全等同於模糊查詢 比如title欄位有這麼個資料』abcd20088ccaa』,使用模糊查詢select * from articles wheretitle like』%2008%』可以查詢到,而使用全文檢索select * from articles where match(title) against(『2008』);是檢索不到的,因為2008不是乙個單詞! 4、使用全文檢索引擎工具包 採用專門的全文檢索開源工具可以檢索某段字串。

資料庫索引 索引優化

二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...

資料庫優化 索引

鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至 2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表 如 sysobjects等 就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。資料庫中,目錄 資料字典 和索引的區別 目錄縱向 索引橫向。優化器根據統...

資料庫索引優化

索引的作用是告訴儲存引擎快速找到我們需要的資料,兩個極端,除了主鍵沒有任何索引,給每乙個列都建立乙個索引,所以索引是在mysql儲存引擎層實現的,而不是在mysql伺服器層實現的,不同的儲存引擎的索引方式是不同的,mysql支援的索引型別,b tree索引是比較常見的,通常所說的索引就是b tree...