mysql里索引的创建原则

MySQL 中创建索引的原则主要是 优化查询性能,避免 索引失效,减少 不必要的索引开销。以下是 索引创建的最佳实践


1. 选择合适的列创建索引

适合创建索引的列

  • 作为查询条件的列 (WHERE)
  • 作为排序的列 (ORDER BY)
  • 作为分组的列 (GROUP BY)
  • 作为关联键的列 (JOIN)

示例

CREATE INDEX idx_trade_date ON trades(trade_date);

适用场景

  • SELECT * FROM trades WHERE trade_date = '2024-03-01'
  • SELECT * FROM trades ORDER BY trade_date DESC

2. 使用合适的索引类型

  • B+树索引(默认,适用于大多数查询)
  • 哈希索引(只适用于等值查询,如 id = 123
  • 全文索引(适用于文本搜索,如 MATCH(content) AGAINST ('关键字')
  • 空间索引(适用于 GIS 地理信息查询)

示例

CREATE FULLTEXT INDEX idx_content ON articles(content);

3. 选择合适的索引列顺序

(1)联合索引:遵循“最左前缀”原则

索引 (A, B, C),可以用于查询 AA, BA, B, C,但不能直接用于 BC

CREATE INDEX idx_trade ON trades(user_id, trade_date, amount);

查询: ✅ SELECT * FROM trades WHERE user_id = 1001;
SELECT * FROM trades WHERE user_id = 1001 AND trade_date > '2024-01-01';
SELECT * FROM trades WHERE trade_date > '2024-01-01';(索引失效)


4. 避免索引失效

(1)数据类型必须匹配

如果 user_idVARCHAR 类型,但查询用的是 INT,索引会失效:

SELECT * FROM trades WHERE user_id = 1001;  -- 错误
SELECT * FROM trades WHERE user_id = '1001'; -- 正确

(2)避免在索引列上使用函数

索引列如果使用 DATE_FORMATLOWERUPPER,索引失效:

SELECT * FROM trades WHERE DATE_FORMAT(trade_date, '%Y-%m-%d') = '2024-03-01'; -- 索引失效

改进

SELECT * FROM trades WHERE trade_date >= '2024-03-01' AND trade_date < '2024-03-02';

(3)避免前导通配符

LIKE '%证券' 无法利用索引,必须是 LIKE '证券%'

SELECT * FROM stocks WHERE name LIKE '腾讯%';  -- 可以使用索引
SELECT * FROM stocks WHERE name LIKE '%腾讯';  -- 索引失效

5. 控制索引数量,避免过多索引

  • 每个表的索引不宜过多,一般3~5个
  • 删除冗余索引,如 idx_trade_date(trade_date)idx_trade(user_id, trade_date, amount)idx_trade_date 可能是多余的。

6. 使用覆盖索引

如果查询的列都在索引中,MySQL 只访问索引,不访问数据页,提高查询速度。

CREATE INDEX idx_user_trade ON trades(user_id, trade_date, amount);
SELECT user_id, trade_date, amount FROM trades WHERE user_id = 1001;

适用场景:只查询索引包含的字段,不涉及 SELECT *


7. 对高并发表考虑索引分区

  • 分区索引:对于大表(如10年证券交易流水),可以按日期分区
ALTER TABLE trades PARTITION BY RANGE (YEAR(trade_date)) (
    PARTITION p2015 VALUES LESS THAN (2016),
    PARTITION p2016 VALUES LESS THAN (2017),
    ...
);

总结

你们的系统查询证券交易流水时,是否遇到索引失效查询性能下降的问题?如果有的话,可以一起优化看看。

MySQL索引创建时应遵循一些基本原则,以提高查询性能并优化数据库结构: 1. **选择恰当的字段**:对经常用于WHERE、JOIN或ORDER BY语句的列创建索引。这些列的数据变化频率相对较低且值的唯一性越高越好。 2. **避免过宽的索引**:如果索引包含过多的列,查询效率会降低,因为每次搜索都需要比较所有列。尽量创建复合索引(如 `(column1, column2)`),当需要同时过滤多个列时。 3. **考虑覆盖索引**:如果一个查询的返回结果可以由索引完全提供,那么就不需要访问数据表了,这称为“覆盖索引”。例如,对于`SELECT column1, column2 FROM table WHERE column1 = ?`,如果`column1`和`column2`都在索引内,就形成了覆盖索引。 4. **避免在频繁更新的列上创建索引**:因为插入、删除或修改操作会使索引失效,可能导致性能下降。但对于读取密集型应用,这通常是可以接受的。 5. **分区和索引配合**:对于大表,可以考虑按某个列进行分区,然后在每个分区上单独创建索引。 6. **避免全表扫描**:理想情况下,索引应该使得大部分查询能够快速定位到特定行,而不是导致全表扫描。 7. **注意哈希索引**:哈希索引只适用于等值查找,而且不能处理排序,所以在涉及范围查询时效果不佳。 8. **定期维护**:通过ANALYZE TABLE或OPTIMIZE TABLE命令检查和调整索引,保持其有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值