當前位置:首頁 » 數據倉庫 » mysql資料庫設計索引
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mysql資料庫設計索引

發布時間: 2022-09-20 08:41:09

1. MYsql資料庫索引怎麼設置

所列三張表只是主外鍵查詢問題,
那每張表的主鍵分別都要建索引(文章ID、分類ID、用戶ID),
第一張表由於要分類關聯查詢、按編輯用戶查詢,所以引用鍵也要分別建索引(分類ID、用戶ID)。

2. mysql資料庫怎麼建索引

MySQL資料庫建立索引步驟:
1、使用SQLPlus或者PLSQL登錄MySQL資料庫。
2、執行語句create index indexname on table(col) tablespace tablespacename;其中
"indexname"為需要建立索引的索引名;
"table"是需要建立索引的表;
"col"為需要建立索引的欄位列;
」tablespacename「為建立索引存放的空間(如果不需要制定表空間則使用「create index indexname on table(col)」)。

3. 資料庫索引怎麼建立

right © 1999-2020, CSDN.NET, All Rights Reserved

程序員必備的瀏覽器插件
登錄

越來越好ing
關注
資料庫索引是什麼,有什麼用,怎麼用 轉載
2018-12-04 23:30:36
5點贊

越來越好ing

碼齡2年

關注
下面是關於資料庫索引的相關知識:

簡單來說,資料庫索引就是資料庫的數據結構!進一步說則是該數據結構中存儲了一張表中某一列的所有值,也就是說索引是基於數據表中的某一列創建的。總而言之:一個索引是由表中某一列上的數據組成,並且這些數據存儲在某個數據結構中。

2.索引的作用。舉個例子,假設有一張數據表Emplyee,該表有三列:

表中有幾萬條記錄。現在要執行下面這條查詢語句,查找出所有名字叫「Jesus」的員工的詳細信息

3.如果沒有資料庫索引功能,資料庫系統會逐行的遍歷整張表,對於每一行都要檢查其Employee_Name欄位是否等於「Jesus」。因為我們要查找所有名字為「Jesus」的員工,所以當我們發現了一條名字是「Jesus」的記錄後,並不能停止繼續查找,因為可能有其他員工也叫「Jesus」。這就意味著,對於表中的幾萬條記錄,資料庫每一條都要檢查。這就是所謂的「全表掃描」( full table scan)

4.而資料庫索引功能索引的最大作用就是加快查詢速度,它能從根本上減少需要掃表的記錄/行的數量。

5.如何創建資料庫索引。可以基於Employee表的兩列創建索引即可:

拓展資料:

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更

4. 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後,同樣要跑一邊主鍵索引,對於使用覆蓋索引的情況下,使用覆蓋索引可以直接解決問題

https://blog.csdn.net/itworld123/article/details/115144202
https://time.geekbang.org/column/article/69236
https://zhuanlan.hu.com/p/334684710
https://www.cxyzjd.com/article/pyzhuren/88431380
https://www.jianshu.com/p/4277d9dd0a9f
https://www.cnblogs.com/rjzheng/p/12557314.html
https://mengkang.net/1302.html
https://note.cser.club/database/bi-xu-le-jie-de-mysql-san-da-ri--binlogredo-log-he-undo-log
https://cloud.tencent.com/developer/news/44861

5. mysql資料庫怎麼創建索引

普通索引 添加INDEX

ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

下面演示下給user表的name欄位添加一個索引
mysql資料庫如何創建索引
mysql資料庫如何創建索引

主鍵索引 添加PRIMARY KEY

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
mysql資料庫如何創建索引
mysql資料庫如何創建索引

唯一索引 添加UNIQUE

ALTER TABLE `table_name` ADD UNIQUE ( `column` )
mysql資料庫如何創建索引

全文索引 添加FULLTEXT

ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
mysql資料庫如何創建索引

如何添加多列索引

ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
mysql資料庫如何創建索引

6. Mysql建索引的注意事項

1.最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2.=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式。

3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別欄位可能在大數據面前區分度就是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的欄位我們都要求是0.1以上,即平均1條掃描10條記錄。

4.索引列不能參與計算,保持列「干凈」,比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的欄位值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』)。

5.盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。

1."一個頂三個"。建了一個(a,b,c)的復合索引,那麼實際等於建了(a),(a,b),(a,b,c)三個索引,因為每多一個索引,都會增加寫操作的開銷和磁碟空間的開銷。對於大量數據的表,這可是不小的開銷!

2.覆蓋索引。同樣的有復合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那麼MySQL可以直接通過遍歷索引取得數據,而無需回表,這減少了很多的隨機io操作。減少io操作,特別的隨機io其實是dba主要的優化策略。所以,在真正的實際應用中,覆蓋索引是主要的提升性能的優化手段之一

3.索引列越多,通過索引篩選出的數據越少。有1000W條數據的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假設假設每個條件可以篩選出10%的數據,如果只有單值索引,那麼通過該索引能篩選出1000W*10%=100w 條數據,然後再回表從100w條數據中找到符合b=2 and c= 3的數據,然後再排序,再分頁;如果是復合索引,通過索引篩選出1000w *10% *10% *10%=1w,然後再排序、分頁,哪個更高效,一眼便知

7. mysql資料庫怎麼建索引

表名右擊,菜單裡面就有索引,然後選擇要索引的欄位。。確定就可以了

8. 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 顯示評注。

9. MYSQL資料庫索引類型都有哪些

在滿足語句需求的情況下,盡量少的訪問資源是資料庫設計的重要原則,這和執行的 SQL 有直接的關系,索引問題又是 SQL 問題中出現頻率最高的,常見的索引問題包括:無索引(失效)、隱式轉換。
1. SQL 執行流程看一個問題,在下面這個表 T 中,如果我要執行 select * from T where k between 3 and 5; 需要執行幾次樹的搜索操作,會掃描多少行?mysql> create table T ( -> ID int primary key, -> k int NOT NULL DEFAULT 0, -> s varchar(16) NOT NULL DEFAULT '', -> index k(k)) -> engine=InnoDB;mysql> insert into T values(100,1, 'aa'),(200,2,'bb'), (300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
這分別是 ID 欄位索引樹、k 欄位索引樹。

這條 SQL 語句的執行流程:

1. 在 k 索引樹上找到 k=3,獲得 ID=3002. 回表到 ID 索引樹查找 ID=300 的記錄,對應 R33. 在 k 索引樹找到下一個值 k=5,ID=5004. 再回到 ID 索引樹找到對應 ID=500 的 R4

5. 在 k 索引樹去下一個值 k=6,不符合條件,循環結束

這個過程讀取了 k 索引樹的三條記錄,回表了兩次。因為查詢結果所需要的數據只在主鍵索引上有,所以必須得回表。所以,我們該如何通過優化索引,來避免回表呢?
2. 常見索引優化2.1 覆蓋索引覆蓋索引,換言之就是索引要覆蓋我們的查詢請求,無需回表。

如果執行的語句是 select ID from T wherek between 3 and 5;,這樣的話因為 ID 的值在 k 索引樹上,就不需要回表了。

覆蓋索引可以減少樹的搜索次數,顯著提升查詢性能,是常用的性能優化手段。

但是,維護索引是有代價的,所以在建立冗餘索引來支持覆蓋索引時要權衡利弊。

2.2 最左前綴原則

B+ 樹的數據項是復合的數據結構,比如 (name,sex,age) 的時候,B+ 樹是按照從左到右的順序來建立搜索樹的,當 (張三,F,26) 這樣的數據來檢索的時候,B+ 樹會優先比較 name 來確定下一步的檢索方向,如果 name 相同再依次比較 sex 和 age,最後得到檢索的數據。

  • # 有這樣一個表 P

  • mysql> create table P (id int primary key, name varchar(10) not null, sex varchar(1), age int, index tl(name,sex,age)) engine=IInnoDB;

  • mysql> insert into P values(1,'張三','F',26),(2,'張三','M',27),(3,'李四','F',28),(4,'烏茲','F',22),(5,'張三','M',21),(6,'王五','M',28);

  • # 下面的語句結果相同

  • mysql> select * from P where name='張三' and sex='F'; ## A1

  • mysql> select * from P where sex='F' and age=26; ## A2

  • # explain 看一下

  • mysql> explain select * from P where name='張三' and sex='F';

  • +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+-------------+

  • | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

  • +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+-------------+

  • | 1 | SIMPLE | P | NULL | ref | tl | tl | 38 | const,const | 1 | 100.00 | Using index |

  • +----+-------------+-------+------------+------+---------------+------+---------+-------------+------+----------+-------------+

  • mysql> explain select * from P where sex='F' and age=26;

  • +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+--------------------------+

  • | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

  • +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+--------------------------+

  • | 1 | SIMPLE | P | NULL | index | NULL | tl | 43 | NULL | 6 | 16.67 | Using where; Using index |

  • +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+--------------------------+

  • 可以清楚的看到,A1 使用 tl 索引,A2 進行了全表掃描,雖然 A2 的兩個條件都在 tl 索引中出現,但是沒有使用到 name 列,不符合最左前綴原則,無法使用索引。所以在建立聯合索引的時候,如何安排索引內的欄位排序是關鍵。評估標準是索引的復用能力,因為支持最左前綴,所以當建立(a,b)這個聯合索引之後,就不需要給 a 單獨建立索引。原則上,如果通過調整順序,可以少維護一個索引,那麼這個順序往往就是需要優先考慮採用的。上面這個例子中,如果查詢條件里只有 b,就是沒法利用(a,b)這個聯合索引的,這時候就不得不維護另一個索引,也就是說要同時維護(a,b)、(b)兩個索引。這樣的話,就需要考慮空間佔用了,比如,name 和 age 的聯合索引,name 欄位比 age 欄位佔用空間大,所以創建(name,age)聯合索引和(age)索引佔用空間是要小於(age,name)、(name)索引的。
  • 2.3 索引下推

  • 以人員表的聯合索引(name, age)為例。如果現在有一個需求:檢索出表中「名字第一個字是張,而且年齡是26歲的所有男性」。那麼,SQL 語句是這么寫的mysql> select * from tuser where name like '張%' and age=26 and sex=M;

  • 通過最左前綴索引規則,會找到 ID1,然後需要判斷其他條件是否滿足在 MySQL 5.6 之前,只能從 ID1 開始一個個回表。到主鍵索引上找出數據行,再對比欄位值。而 MySQL 5.6 引入的索引下推優化(index condition pushdown),可以在索引遍歷過程中,對索引中包含的欄位先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。這樣,減少了回表次數和之後再次過濾的工作量,明顯提高檢索速度。
  • 2.4 隱式類型轉化

  • 隱式類型轉化主要原因是,表結構中指定的數據類型與傳入的數據類型不同,導致索引無法使用。所以有兩種方案:
  • 修改表結構,修改欄位數據類型。
  • 修改應用,將應用中傳入的字元類型改為與表結構相同類型。

  • 3. 為什麼會選錯索引3.1 優化器選擇索引是優化器的工作,其目的是找到一個最優的執行方案,用最小的代價去執行語句。在資料庫中,掃描行數是影響執行代價的因素之一。掃描的行數越少,意味著訪問磁碟數據的次數越少,消耗的 CPU 資源越少。當然,掃描行數並不是唯一的判斷標准,優化器還會結合是否使用臨時表、是否排序等因素進行綜合判斷。
  • 3.2 掃描行數

  • MySQL 在真正開始執行語句之前,並不能精確的知道滿足這個條件的記錄有多少條,只能通過索引的區分度來判斷。顯然,一個索引上不同的值越多,索引的區分度就越好,而一個索引上不同值的個數我們稱為「基數」,也就是說,這個基數越大,索引的區分度越好。# 通過 show index 方法,查看索引的基數mysql> show index from t;+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| t | 0 | PRIMARY | 1 | id | A | 95636 | NULL | NULL | | BTREE | | || t | 1 | a | 1 | a | A | 96436 | NULL | NULL | YES | BTREE | | || t | 1 | b | 1 | b | A | 96436 | NULL | NULL | YES | BTREE | | |+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

  • MySQL 使用采樣統計方法來估算基數:采樣統計的時候,InnoDB 默認會選擇 N 個數據頁,統計這些頁面上的不同值,得到一個平均值,然後乘以這個索引的頁面數,就得到了這個索引的基數。而數據表是會持續更新的,索引統計信息也不會固定不變。所以,當變更的數據行數超過 1/M 的時候,會自動觸發重新做一次索引統計。
  • 在 MySQL 中,有兩種存儲索引統計的方式,可以通過設置參數 innodb_stats_persistent 的值來選擇:

  • on 表示統計信息會持久化存儲。默認 N = 20,M = 10。

  • off 表示統計信息只存儲在內存中。默認 N = 8,M = 16。

  • 由於是采樣統計,所以不管 N 是 20 還是 8,這個基數都很容易不準確。所以,冤有頭債有主,MySQL 選錯索引,還得歸咎到沒能准確地判斷出掃描行數。
  • 可以用 analyze table 來重新統計索引信息,進行修正。

  • ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

  • 3.3 索引選擇異常和處理1. 採用 force index 強行選擇一個索引。2. 可以考慮修改語句,引導 MySQL 使用我們期望的索引。3. 有些場景下,可以新建一個更合適的索引,來提供給優化器做選擇,或刪掉誤用的索引。