mysql 创建job_MySQL 索引创建
MySQL 索引創(chuàng)建
簡介:在本教程中,您將了解索引以及如何使用MySQL?CREATE INDEX語句向表中添加索引。
電話簿比喻
假設(shè)您有一本電話簿,其中包含城市中所有人的姓名和電話號碼。假設(shè)你想找到Bob Cat的電話號碼。知道這些名稱是按字母順序排列的,首先要查找姓氏為Cat的頁面,然后查找Bob和他的電話號碼。
現(xiàn)在,如果電話簿中的姓名沒有按字母順序排序,則需要瀏覽所有頁面,閱讀其中的每個名稱,直到找到Bob Cat。這稱為順序搜索。您將查看所有條目,直到找到具有您要查找的電話號碼的人員為止。
將電話簿與數(shù)據(jù)庫表相關(guān)聯(lián),如果您有電話簿表并且必須找到Bob Cat的電話號碼,則可以執(zhí)行以下查詢:
SELECT
phone_number
FROM
phone_book
WHERE
first_name = 'Bob' AND
last_name = 'Cat';
這很容易。雖然查詢速度很快,但數(shù)據(jù)庫必須掃描表的所有行,直到找到行為止。如果表有數(shù)百萬行而沒有索引,則數(shù)據(jù)檢索將花費大量時間來返回結(jié)果。
索引簡介
索引是一種數(shù)據(jù)結(jié)構(gòu),例如B-Tree,它以增加額外寫入和存儲為代價來提高表上數(shù)據(jù)檢索的速度。
查詢優(yōu)化器可以使用索引來快速定位數(shù)據(jù),而無需掃描表中給定查詢的每一行。
當(dāng)您使用主鍵或唯一鍵創(chuàng)建表時,MySQL會自動創(chuàng)建一個名為PRIMARY的特殊索引。索引稱為聚簇索引。
PRIMARY索引是特殊的,因為索引本身與數(shù)據(jù)一起存儲在同一個表中。 聚簇索引強制執(zhí)行表中的行順序。
除PRIMARY索引之外的其他索引稱為二級索引或非聚簇索引。
MySQL CREATE INDEX語句
通常,您在創(chuàng)建時為表創(chuàng)建索引。例如,以下語句創(chuàng)建一個新表,其索引由兩列c2和c3組成。
CREATE TABLE t(
c1 INT PRIMARY KEY,
c2 INT NOT NULL,
c3 INT NOT NULL,
c4 VARCHAR(10),
INDEX (c2,c3)
);
要為列或一組列添加索引,請使用以下CREATE INDEX語句:
CREATE INDEX index_name ON table_name (column_list)
要為列或列列表創(chuàng)建索引,請指定索引名稱,索引所屬的表以及列列表。
例如,要為列c4添加新索引,請使用以下語句:
CREATE INDEX idx_c4 ON t(c4);
默認(rèn)情況下,如果未指定索引類型,MySQL將創(chuàng)建B-Tree索引。以下顯示了基于表的存儲引擎的允許索引類型:
存儲引擎
允許的索引類型
InnoDB
BTREE
MyISAM
BTREE
MEMORY / HEAP
HASH,BTREE
請注意,CREATE INDEX上面的CREATE INDEX語句是MySQL引入的語句的簡化版本。我們將在后續(xù)教程中介紹更多選項。
MySQL CREATE INDEX示例
以下聲明查找職位名稱為的員工Sales Rep:
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
jobTitle = 'Sales Rep';
這是輸出:
+----------------+-----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+-----------+-----------+
| 1165 | Jennings | Leslie |
| 1166 | Thompson | Leslie |
| 1188 | Firrelli | Julie |
| 1216 | Patterson | Steve |
| 1286 | Tseng | Foon Yue |
| 1323 | Vanauf | George |
| 1337 | Bondur | Loui |
| 1370 | Hernandez | Gerard |
| 1401 | Castillo | Pamela |
| 1501 | Bott | Larry |
| 1504 | Jones | Barry |
| 1611 | Fixter | Andy |
| 1612 | Marsh | Peter |
| 1619 | King | Tom |
| 1621 | Nishi | Mami |
| 1625 | Kato | Yoshimi |
| 1702 | Gerard | Martin |
+----------------+-----------+-----------+
17 rows in set (0.01 sec)
我們有17行,表明17名員工的職位是銷售代表。
要查看MySQL如何在內(nèi)部執(zhí)行此查詢,請在SELECT語句的開頭添加EXPLAIN子句,如下所示:
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 23 | 10.00 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)
正如您所看到的,MySQL必須掃描包含23行的整個表,以查找具有Sales Rep職位的員工。
現(xiàn)在,讓我們jobTitle使用以下CREATE INDEX語句為列創(chuàng)建索引 ??:
CREATE INDEX jobTitle ON employees(jobTitle);
并再次執(zhí)行上述語句:
EXPLAIN SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
jobTitle = 'Sales Rep';
輸出是:
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | employees | NULL | ALL | jobTitle | NULL | NULL | NULL | 23 | 73.91 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
正如您所看到的,MySQL只需要從jobTitle鍵列中找到17行, ??而不是掃描整個表。
要顯示表的索引,請使用
SHOW INDEXES FROM employees;
這是輸出:
+-----------+------------+------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| employees | 0 | PRIMARY | 1 | employeeNumber | A | 23 | NULL | NULL | | BTREE | | |
| employees | 1 | reportsTo | 1 | reportsTo | A | 7 | NULL | NULL | YES | BTREE | | |
| employees | 1 | officeCode | 1 | officeCode | A | 7 | NULL | NULL | | BTREE | | |
| employees | 1 | jobTitle | 1 | jobTitle | A | 9 | NULL | NULL | | BTREE | | |
+-----------+------------+------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)
在本教程中,您已經(jīng)了解了MySQL索引以及如何為表中的列添加索引。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的mysql 创建job_MySQL 索引创建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装mysql.dox_linux虚拟机
- 下一篇: mysql逻辑删除的问题_数据库表涉及-