应用索引设计原则示例:
- 最适合索引的列是出现在 WHERE 子句和连接子句中的列:
假设我们有一个名为 orders
的表,包含订单信息,其中包括列 customer_id
和 order_date
。如果我们经常查询特定客户的订单或特定日期范围内的订单,那么在 customer_id
和 order_date
列上创建索引将会提高查询性能。
- 索引列的基数越大,索引效果越好:
考虑一个名为 products
的表,包含列 category
和 product_name
。如果 category
列有很多不同的取值,而 product_name
列的取值相对较少,那么在 category
列上创建索引的效果会比在 product_name
列上创建索引更好。
- 使用前缀索引可以减少索引占用的空间:
假设我们有一个名为 customers
的表,包含列 first_name
和 last_name
。如果我们只关心查询客户的姓氏,而不需要全名搜索,那么在 last_name
列上使用前缀索引(例如前缀长度为3)可以减少索引占用的空间。
假设我们有一个名为 customers
的表,包含以下结构:
customers 表结构:
customer_id | first_name | last_name |
---|---|---|
1 | John | Smith |
2 | Emma | Johnson |
3 | Mike | Smith |
4 | Sarah | Davis |
5 | David | Johnson |
现在,我们只对客户的姓氏感兴趣,并且不需要进行全名搜索。为了优化查询性能和减少索引占用的空间,我们可以在 last_name
列上使用前缀索引。
假设我们使用前缀长度为 3 的索引,在 last_name
列上创建前缀索引。这样,只有前三个字符被索引,可以加速以姓氏为条件的查询操作。
以下是在 last_name
列上使用前缀索引的示例查询:
SELECT *
FROM customers
WHERE last_name LIKE 'Smi%';
在这个示例中,我们使用 LIKE
运算符进行姓氏以 “Smi” 开头的查询。由于我们在 last_name
列上创建了前缀索引,数据库引擎可以利用该索引来快速定位姓氏以 “Smi” 开头的客户。
查询结果将是姓氏以 “Smi” 开头的客户的完整信息:
customer_id | first_name | last_name |
---|---|---|
1 | John | Smith |
3 | Mike | Smith |
通过在 last_name
列上使用前缀索引,我们可以减少索引占用的空间,提高查询性能,并满足只关心客户姓氏的查询需求。
- 索引不是越多越好:
考虑一个名为 orders
的表,包含列 customer_id
和 order_date
。如果我们对这两个列都创建索引,那么在写操作(插入、更新、删除)时会产生额外的索引维护开销,降低写操作的性能。在这种情况下,需要权衡索引的数量和写操作的频率。
- 主键要尽可能选择较短的数据类型:
在使用 InnoDB 存储引擎时,如果有一个名为 users
的表,包含列 user_id
(主键)和 email
,我们可以选择将 user_id
设计为一个较短的数据类型(如整数),以减少索引占用的空间,并提高索引的缓存效果。
假设我们有一个名为 users
的表,包含以下结构:
users 表结构:
user_id | |
---|---|
1 | john.smith@example.com |
2 | emma.johnson@example.com |
3 | mike.smith@example.com |
4 | sarah.davis@example.com |
5 | david.johnson@example.com |
在这个示例中,user_id
列是主键列,用于唯一标识每个用户。email
列用于存储用户的电子邮件地址。
由于 user_id
列是主键列,它将自动创建一个聚簇索引(Clustered Index),在 InnoDB 存储引擎中,聚簇索引的叶子节点保存着整行数据。这意味着 user_id
的数据类型将会直接影响索引的大小和性能。
如果我们将 user_id
设计为一个较短的数据类型,比如整数(INT),相比于较长的数据类型(如字符串类型),可以减少索引占用的空间,并提高索引的缓存效果。较小的索引占用更少的磁盘空间,可以在内存中缓存更多的索引页,从而提高查询性能。
以下是 users
表示例查询:
SELECT *
FROM users
WHERE user_id = 3;
这个查询根据 user_id
列的值进行等值匹配,由于 user_id
列上的聚簇索引,数据库引擎可以直接定位到对应的行,快速返回结果。
查询结果将是 user_id
为 3 的用户的完整信息:
user_id | |
---|---|
3 | mike.smith@example.com |
通过将 user_id
设计为较短的整数数据类型,我们可以减少索引占用的空间,提高索引的缓存效果,并提高查询性能。
这些是一些示例,展示了如何应用索引设计原则来选择适当的列进行索引。具体的索引设计应根据实际场景和查询需求来进行综合考虑。