mysql建立索引實例,mysql索引如何實現

本文目錄一覽:

mysql資料庫是否可以為視圖創建索引,可以的話,請問如果創建

mysql資料庫可以為視圖創建索引,創建方法為:

1、在mysql資料庫中為數據表創建索引時,可在創建表的時候直接創建索引,如下圖創建普通索引。

2、通過explain命令可以查看正在被使用的索引。

3、另外還可以創建唯一索引,唯一索引要求被約束列的值是唯一值,不能重複。

4、如果唯一索引列的值在創建時出現重複是無法正常插入的,如下圖。

5、另外還可以通過multiidx在同一個表中創建複合索引,如下圖。

6、在已經存在的表上,也可以直接通過create來添加索引,如下圖。

Mysql建立索引經驗

在實際開發中使用資料庫時,難免會遇到一些大表數據,對這些數據進行查詢時,有時候SQL會查詢得特別慢,這時候,有經驗的老師傅會告訴你,你看一下哪幾個欄位查的多,加一個索引就好了。

那麼,怎麼合理地建立索引呢?這裡分享一下我的一些經驗,如有不妥之處,歡迎批評指正。

1、不要盲目建立索引 , 先分析再創建

索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進行增刪改時,索引樹也要同樣地進行維護。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發完成後,分析一下,去針對大多數的查詢,建立聯合索引。

2、使用聯合索引盡量覆蓋多的條件

這是說在一個慢sql里假如有五個where ,一個 order by ,那麼我們的聯合索引盡量覆蓋到這五個查詢條件,如果有必要,order by 也覆蓋上 。

3、小基數欄位不需要索引

這個意思是,如果一張表裡某個欄位的值只有那麼幾個,那麼你針對這個欄位建立的索引其實沒什麼意義,比如說,一個性別欄位就兩種結果,你建了索引,排序也沒什麼意思(也就是索引里把男女給分開了)

所以說,索引盡量選擇基數大的數據去建立,能最大化地利用索引

4、長字元串可以使用前綴索引

我們建立索引的欄位盡量選擇欄位類型較小的,比如一個varchar(20)和varchar(256)的,我們在20的上面建立的索引和在256上就有明顯的差距(字元串那麼長排序也不好排呀,唉)。

當然,如果一定是要對varchar(256)建立索引,我們可以選擇裡面的前20個字元放在索引樹里(這裡的20不絕對,選擇能盡量分辨數據的最小字元欄位設計),類似這樣KEY index(name(20),age,job) ,索引只會對name的前20個字元進行搜索,但前綴索引無法適用於order by 和 group by。

5、對排序欄位設計索引的優先順序低

如果一個SQL里我們出現了範圍查找,後邊又跟著一個排序欄位,那麼我們優先給範圍查找的欄位設置索引,而不是優先排序。

6、如果出現慢SQL,可以設計一個只針對該條SQL的聯合索引。

不過慢SQL的優化,需要一步步去進行分析,可以先用explain查看SQL語句的分析結果,再針對結果去做相應的改進。explain的東西我們下次再講。

PS:在 select 語句之前增加 explain 關鍵字,MySQL 會在查詢上設置一個標記,執行查詢會返回執行計劃的信息,而不是 執行這條SQL。

mysql索引

二叉搜索樹、N叉樹

頁分裂:B+樹的插入可能會引起數據頁的分裂,刪除可能會引起數據頁的合併,二者都是比較重的IO消耗,所以比較好的方式是順序插入數據,這也是我們一般使用自增主鍵的原因之一。

頁分裂逆過程:頁合併,當刪除數據後,相鄰的兩個數據頁利用率很低的時候會做數據頁合併

主鍵索引:key:主鍵,value:數據頁,存儲每行數據

非主鍵索引:key:非主鍵索引,value:主鍵key,導致回表

最左匹配:優先將區分度高的列放到前面,這樣可以高效索引,

最左匹配原則遇到範圍查詢就停止匹配,範圍查詢(、、between、like)為什麼?因為出現範圍匹配後,後面的索引欄位無法保證有序,局部有序失去,順序失去則無法提高查詢效率

SELECT * FROM table WHERE a IN (1,2,3) and b 1;

如何建立索引?

還是對(a,b)建立索引,因為IN在這裡可以視為等值引用,不會中止索引匹配,所以還是(a,b)!

索引組織表

索引用頁存儲:key【10】-point【6】,通過調整key大小,當頁大小固定的情況下,通過調整key大小,使得N叉樹變化;

如key 10, point 6則單個索引16位元組,頁大小為16k,則頁面總共可以存儲1024個索引,即N大小

覆蓋索引: 二級索引的信息已經存在想要的列,例如主鍵

如果現在有一個高頻請求,要根據市民的身份證號查詢他的姓名,這個聯合索引就有意義了。它可以在這個高頻請求上用到覆蓋索引,不再需要回表查整行記錄,減少語句的執行時間。

索引下推優化:可以在索引遍歷過程中,對索引中包含的欄位先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。

整理索引碎片,重建表:alter table T engine=InnoDB

  首先是看key的大小,另外是數據頁的大小,如果需要改變N,則需要從這兩個方面做改動;

一個innoDB引擎的表,數據量非常大,根據二級索引搜索會比主鍵搜索快,文章闡述的原因是主鍵索引和數據行在一起,非常大搜索慢,我的疑惑是:通過普通索引找到主鍵ID後,同樣要跑一邊主鍵索引,對於使用覆蓋索引的情況下,使用覆蓋索引可以直接解決問題

mysql聯合索引如何創建?

CREATE TABLE `test` (‘aaa’ varchar(16) NOT NULL default ”, ‘bbb’ varchar(16) NOT NULL default ”, ‘ccc’ int(11) UNSIGNED NOT NULL default 0, KEY `sindex` (`aaa`,`bbb`,`ccc`) ) ENGINE=MyISAM COMMENT=”;\x0d\x0a\x0d\x0a這樣就在 aaa、bbb、ccc 3列上建立聯合索引了。\x0d\x0a\x0d\x0a如果表已經建好了,那麼就在phpmyadmin裡面執行:\x0d\x0aalert table test add INDEX `sindex` (`aaa`,`bbb`,`ccc`) \x0d\x0a\x0d\x0a就可以在這3列上建立聯合索引了。

如何為表建立索引?

建立索引的優缺點:

為什麼要創建索引呢?

這是因為,創建索引可以大大提高系統的性能。

第一、通過創建唯一性索引,可以保證資料庫表中每一行數據的唯一性。

第二、可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。

第三、可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。

第四、在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。

第五、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

也許會有人要問:增加索引有如此多的優點,為什麼不對表中的每一個列創建一個索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優點, 但是,為表中的每一個列都增加索引,是非常不明智的。

這是因為,增加索引也有許多不利的一個方面:

第一、創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。

第二、索引需要佔物理空間,除了數據表占數據空間之外,每一個索引還要佔一定的物理空間。如果要建立聚簇索引,那麼需要的空間就會更大。

第三、當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

什麼樣的欄位適合創建索引:

索引是建立在資料庫表中的某些列的上面。因此,在創建索引的時候,應該仔細考慮在哪些列上可以創建索引,在哪些列上不能創建索引。

一般來說,應該在這些列上創建索引,例如:

第一、在經常需要搜索的列上,可以加快搜索的速度;

第二、在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;

第三、在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;

第四、在經常需要根據範圍進行搜索的列上創建索引,因為索引已經排序,其指定的範圍是連續的;

第五、在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

第六、在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。

建立索引,一般按照select的where條件來建立,比如: select的條件是where f1 and f2,那麼如果我們在欄位f1或欄位f2上簡歷索引是沒有用的,只有在欄位f1和f2上同時建立索引才有用等。

什麼樣的欄位不適合創建索引:

同樣,對於有些列不應該創建索引。一般來說,不應該創建索引的的這些列具有下列特點:

第一,對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,

並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。

第二,對於那些只有很少數據值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,

在查詢的結果中,結果集的數據行佔了表中數據行的很大比 例,即需要在表中搜索的數據行的比例很大。

增加索引,並不能明顯加快檢索速度。

第三,對於那些定義為text, p_w_picpath和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要麼相當大,要麼取值很少。

第四,當修改性能遠遠大於檢索性能時,不應該創建索 引。這是因為,修改性能和檢索性能是互相矛盾的。

當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。

因此,當修改性能遠遠大於檢索性能時,不應該創建索引。

創建索引的方法::

1、創建索引,例如 create index 索引的名字 on table_name (列的列表);

2、修改表,例如 alter table table_name add index[索引的名字] (列的列表);

3、創建表的時候指定索引,例如create table table_name ( […], INDEX [索引的名字] (列的列表) );

查看錶中索引的方法:

show index from table_name; 查看索引

索引的類型及創建例子::

1.PRIMARY KEY (主鍵索引)

mysql alter table table_name add primary key ( `column` )

2.UNIQUE 或 UNIQUE KEY (唯一索引)

mysql alter table table_name add unique (`column`)

3.FULLTEXT (全文索引)

mysql alter table table_name add fulltext (`column` )

4.INDEX (普通索引)

mysql alter table table_name add index index_name ( `column` )

5.多列索引 (聚簇索引)

mysql alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )

修改表中的索引:

alter table tablename drop primary key,add primary key(fileda,filedb)

mysql如何建立索引

我們可以通過查看索引的屬性來判斷創建索引的方法。

查看索引的語法格式如下:

SHOW INDEX FROM 表名 [ FROM 資料庫名]

語法說明如下:

表名:指定需要查看索引的數據表名。

資料庫名:指定需要查看索引的數據表所在的資料庫,可省略。比如,SHOW INDEX FROM student FROM test; 語句表示查看 test 資料庫中 student 數據表的索引。

示例

使用 SHOW INDEX 語句查看《MySQL創建索引》一節中 tb_stu_info2 數據表的索引信息,SQL 語句和運行結果如下所示。

mysql SHOW INDEX FROM tb_stu_info2\G

1. row

Table: tb_stu_info2

Non_unique: 0

Key_name: height

Seq_in_index: 1

Column_name: height

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null: YES

Index_type: BTREE

Comment:

Index_comment:

1 row in set (0.03 sec)

其中各主要參數說明如下:

參數 說明

Table 表示創建索引的數據表名,這裡是 tb_stu_info2 數據表。

Non_unique 表示該索引是否是唯一索引。若不是唯一索引,則該列的值為 1;若是唯一索引,則該列的值為 0。

Key_name 表示索引的名稱。

Seq_in_index 表示該列在索引中的位置,如果索引是單列的,則該列的值為 1;如果索引是組合索引,則該列的值為每列在索引定義中的順序。

Column_name 表示定義索引的列欄位。

Collation 表示列以何種順序存儲在索引中。在 MySQL 中,升序顯示值「A」(升序),若顯示為 NULL,則表示無分類。

Cardinality 索引中唯一值數目的估計值。基數根據被存儲為整數的統計數據計數,所以即使對於小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,MySQL 使用該索引的機會就越大。

Sub_part 表示列中被編入索引的字元的數量。若列只是部分被編入索引,則該列的值為被編入索引的字元的數目;若整列被編入索引,則該列的值為 NULL。

Packed 指示關鍵字如何被壓縮。若沒有被壓縮,值為 NULL。

Null 用於顯示索引列中是否包含 NULL。若列含有 NULL,該列的值為 YES。若沒有,則該列的值為 NO。

Index_type 顯示索引使用的類型和方法(BTREE、FULLTEXT、HASH、RTREE)。

Comment 顯示評註。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297424.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-28 12:15
下一篇 2024-12-28 12:15

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Python基本索引用法介紹

    Python基本索引是指通過下標來獲取列表、元組、字元串等數據類型中的元素。下面將從多個方面對Python基本索引進行詳細的闡述。 一、列表(List)的基本索引 列表是Pytho…

    編程 2025-04-29
  • 如何將Oracle索引變成另一個表?

    如果你需要將一個Oracle索引導入到另一個表中,可以按照以下步驟來完成這個過程。 一、創建目標表 首先,需要在資料庫中創建一個新的表格,用來存放索引數據。可以通過以下代碼創建一個…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • 索引abc,bc會走索引嗎

    答案是:取決於MySQL版本和表結構 一、MySQL版本的影響 在MySQL 5.6之前的版本中,MySQL會同時使用abc和bc索引。但在MySQL 5.6及之後的版本中,MyS…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • Django ORM如何實現或的條件查詢

    在我們使用Django進行資料庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Python切片索引越界是否會報錯

    解答:當對一個字元串、列表、元組進行切片時,如果索引越界會返回空序列,不會報錯。 一、切片索引的概念 切片是指對序列進行操作,從其中一段截取一個新序列。序列可以是字元串、列表、元組…

    編程 2025-04-29

發表回復

登錄後才能評論