?前言:先創建一個練習的數據庫和數據
1.創建數據庫并創建數據表的基本結構
-- 創建練習數據庫
CREATE DATABASE index_practice;
USE index_practice;-- 創建基礎表(包含CREATE TABLE時創建索引)
CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵索引(自動創建)product_code VARCHAR(20) UNIQUE, -- 唯一索引product_name VARCHAR(50) NOT NULL,price DECIMAL(10,2),description TEXT,INDEX name_index (product_name(10)) -- 前綴索引
) ENGINE=InnoDB;
?2.導入實例數據?
-- 插入最少量的測試數據
INSERT INTO products (product_code, product_name, price, description) VALUES
('P1001', '無線鼠標', 99.00, '2.4G無線連接'),
('P1002', '機械鍵盤', 299.00, 'RGB背光鍵盤'),
('P1003', '藍牙耳機', 199.00, '主動降噪功能'),
('P1004', '智能手表', 599.00, '心率監測功能');
索引的優點
- 可以提高查詢速度。
- 可以確保數據的唯一性。
- 提高ORDER BY和GROUP BY的執行速度。
索引設計規則
- 為頻繁查詢的字段創建索引。
- 數據量較小的表最好不要創建索引。
- 盡量在不同值較多的字段上創建索引。
- 一個表中的索引不是越多越好,需要限制索引的數量。
- 對于頻繁進行插入、刪除、修改操作的表,創建的索引越多,則更新表所耗費的時間就越長。
一、索引的分類?
1.普通索引
最基本的索引類型,它沒有唯一性的限制,可以有重復值和空值。創建普通索引的關鍵字是INDEX。
2.唯一索引
這種索引與普通索引基本相同,區別在于唯一索引的索引字段的值必須是唯一的,不允許重復,但允許有空值。創建唯一索引的關鍵字是UNIQUE。
3.主鍵索引
主鍵索引是一種特殊的唯一索引,不同之處在于每張表只能有一個主鍵索引,且不允許有空值。創建主鍵索引的關鍵字是PRIMARY KEY,即主鍵。一般在創建表時指定主鍵,也可以通過修改表的方式添加主鍵。
4.全文索引
全文索引只能在CHAR、VARCHAR或者TEXT類型的字段上創建,并且只能在存儲引擎為MyISAM和InnoDB的表中創建。創建全文索引的關鍵字是FULLTEXT。當查詢數據量較大的字符串類型的字段時,使用全文索引可以提高查詢速度。?
注意:
創建在一個字段上的索引稱為單索引
創建在多個字段上的索引稱為組合索引、復合索引或多列索引
如果唯一索引是組合索引,則多個字段的組合必須是唯一的。
二、創建索引?
CREATE [ UNIQUE | FULLTEXT ] INDEX 索引名
ON 表名 (字段名稱1 [ (長度1) ] [ ASC ? DESC ]
[, 字段名稱2 [ (長度2) ] [ ASC ? DESC ]?] );
說明:
- 索引名:指定創建的索引名稱,在一個表中可以創建多個索引,但是每個索引名必須是唯一的。
- UNIQUE | FULLTEXT:可選項,UNIQUE表示創建的是唯一索引;FULLTEXT表示創建的是全文索引。
- 長度:表示使用字段前多少個字符創建索引,這樣可以減少索引文件的大小。只能對字符串類型的字段指定長度。
- ASC |?DESC:指定索引按照升序ASC或者降序DESC排序。默認值為ASC。?
?1.使用CREATE INDEX語句創建索引
CREATE TABLE demo_table (id INT PRIMARY KEY, -- 主鍵索引col1 VARCHAR(20) UNIQUE, -- 唯一索引col2 VARCHAR(30),INDEX idx_col2 (col2) -- 普通索引
);mysql> DESC demo_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| col1 | varchar(20) | YES | UNI | NULL | |
| col2 | varchar(30) | YES | MUL | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
2.使用ALTER TABLE語句添加索引?
CREATE INDEX idx_name ON products(product_name);mysql> CREATE INDEX idx_name ON products(product_name);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> DESC products;
+--------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| product_code | varchar(20) | YES | UNI | NULL | |
| product_name | varchar(50) | NO | MUL | NULL | |
| price | decimal(10,2) | YES | | NULL | |
| description | text | YES | | NULL | |
+--------------+---------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
3.使用CREATE TABLE語句創建索引
ALTER TABLE products ADD INDEX idx_price (price);mysql> ALTER TABLE products ADD INDEX idx_price (price);
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> DESC products;
+--------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| product_code | varchar(20) | YES | UNI | NULL | |
| product_name | varchar(50) | NO | MUL | NULL | |
| price | decimal(10,2) | YES | MUL | NULL | |
| description | text | YES | | NULL | |
+--------------+---------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
三、查看索引
SHOW { INDEX | INDEXES | KEYS }{ FROM | IN } 表名 [{ FROM | IN } 數據庫名];
- SHOW INDEX語句以二維表的形式顯示指定表中的所有索引信息
- 由于顯示的信息較多不易查看,使用\G參數可以將每一行垂直顯示,查看效果更好。?
SHOW INDEX FROM products;mysql> SHOW INDEX FROM products;
+----------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+----------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| products | 0 | PRIMARY | 1 | id | A | 4 | NULL | NULL | | BTREE | | | YES | NULL |
| products | 0 | product_code | 1 | product_code | A | 4 | NULL | NULL | YES | BTREE | | | YES | NULL |
| products | 1 | name_index | 1 | product_name | A | 4 | 10 | NULL | | BTREE | | | YES | NULL |
| products | 1 | idx_name | 1 | product_name | A | 4 | NULL | NULL | | BTREE | | | YES | NULL |
| products | 1 | idx_price | 1 | price | A | 4 | NULL | NULL | YES | BTREE | | | YES | NULL |
+----------+------------+--------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
5 rows in set (0.03 sec)
四、刪除索引
1.使用DROP INDEX語句刪除索引
DROP INDEX 索引名 ON 表名;
DROP INDEX idx_name ON products;
2.使用ALTER TABLE語句刪除索引?
ALTER TABLE 表名
DROP INDEX 索引名
DROP PRIMARY KEY ;
ALTER TABLE products
DROP INDEX idx_price;