应用索引设计原则示例:
- 最适合索引的列是出现在 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 设计为较短的整数数据类型,我们可以减少索引占用的空间,提高索引的缓存效果,并提高查询性能。
这些是一些示例,展示了如何应用索引设计原则来选择适当的列进行索引。具体的索引设计应根据实际场景和查询需求来进行综合考虑。
文章介绍了数据库索引设计的原则,包括在经常用于查询的列上创建索引,考虑列的基数,使用前缀索引来节省空间,以及权衡索引数量与写操作性能。举例说明了在`customer_id`和`order_date`列上创建索引,以及在`last_name`列上使用前缀索引的情况。同时强调了主键应选择较短数据类型以优化索引性能。
1131

被折叠的 条评论
为什么被折叠?



