面试mysql
在 MySQL 中,索引用于提高查询性能。索引的类型有多种,主要包括以下几种:
1. **普通索引(Normal Index)**:
- 这是最常见的索引类型,没有任何约束条件。
- 可以重复,允许 `NULL` 值。
- 创建方法:
```sql
CREATE INDEX index_name ON table_name(column_name);
```
2. **唯一索引(Unique Index)**:
- 索引列中的所有值必须唯一。
- 允许 `NULL` 值,但每个索引列只能有一个 `NULL`。
- 创建方法:
```sql
CREATE UNIQUE INDEX index_name ON table_name(column_name);
```
3. **主键索引(Primary Key Index)**:
- 这是一种特殊的唯一索引,不允许 `NULL` 值。
- 每个表只能有一个主键。
- 通常在创建表时定义主键索引:
```sql
CREATE TABLE table_name (
id INT PRIMARY KEY,
column_name1 VARCHAR(255),
column_name2 INT
);
```
4. **全文索引(Full-Text Index)**:
- 用于全文检索,可以在 `CHAR`、`VARCHAR` 或 `TEXT` 类型的列上创建。
- 通常用于查找文本中的关键词。
- 创建方法:
```sql
CREATE FULLTEXT INDEX index_name ON table_name(column_name);
```
5. **空间索引(Spatial Index)**:
- 主要用于地理数据类型的列(如 `POINT`、`GEOMETRY`)。
- 通常用于处理 GIS 数据。
- 创建方法:
```sql
CREATE SPATIAL INDEX index_name ON table_name(column_name);
```
6. **复合索引(Composite Index)**:
- 在多个列上创建的索引,可以加速同时涉及多个列的查询。
- 创建方法:
```sql
CREATE INDEX index_name ON table_name(column1, column2);
```
### 创建样例
假设我们有一个表 `users`,包含用户信息:
```sql
CREATE TABLE users (
id INT AUTO_INCREMENT,
username VARCHAR(255),
email VARCHAR(255),
age INT,
bio TEXT,
location POINT,
PRIMARY KEY (id)
);
```
1. **普通索引**:
```sql
CREATE INDEX idx_username ON users(username);
```
2. **唯一索引**:
```sql
CREATE UNIQUE INDEX idx_email ON users(email);
```
3. **全文索引**:
```sql
CREATE FULLTEXT INDEX idx_bio ON users(bio);
```
4. **空间索引**:
```sql
CREATE SPATIAL INDEX idx_location ON users(location);
```
5. **复合索引**:
```sql
CREATE INDEX idx_username_age ON users(username, age);
```
通过这些索引类型,可以针对不同的查询需求优化数据库的查询性能。