创建数据索引的基本原则

建立索引常用的规则如下:


1、表的主键、外键必须有索引;

2、数据量超过300的表应该有索引;

3、经常与其他表进行连接的表,在连接字段上应该建立索引;

4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

5、索引应该建在选择性高的字段上;

6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

   A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

   B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

   C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

   D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

   E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

8、频繁进行数据操作的表,不要建立太多的索引;

9、删除无用的索引,避免对执行计划造成负面影响;

数据库创建索引的原则

索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间。所以是否要为表增加索引、索引建立在那些字段上,是创建索引前必须要考虑的问题。解决此问题就是分析应用程序的业务处理、数据使用,为经常被用作查询条件、或者被要求排序的字段建立索引。

索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。

一般选择在这样的列上创建索引:

1.在经常需要搜索查询的列上创建索引,可以加快搜索的速度;

2.在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构;

3.在经常用在连接的列上创建索引,这些列主要是一些外键,可以加快连接的速度;

4.在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

5.在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询 时间;

6.在经常使用在Where子句中的列上面创建索引,加快条件的判断速度;

7.为经常出现在关键字order by、group by、distinct后面的字段,建立索引。

 一般不选择具有这些特点的列上创建索引:


1.对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查 询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求;

2.不要在有大量相同取值的字段上,建立索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加 快检索速度;

3.对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少;

4.当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。​

创建索引需要注意的地方:

1.限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。

2.避免在取值朝一个方向增长的字段(例如:日期类型的字段)上,建立索引;对复合索引,避免将这种类型的字段放置在最前面。由于字段的取值总是朝一个方向 增长,新记录总是存放在索引的最后一个叶页中,从而不断地引起该叶页的访问竞争、新叶页的分配、中间分支页的拆分。此外,如果所建索引是聚集索引,表中数 据按照索引的排列顺序存放,所有的插入操作都集中在最后一个数据页上进行,从而引起插入“热点”。

3.对复合索引,按照字段在查询条件中出现的频度建立索引。在复合索引中,记录首先按照第一个字段排序。对于在第一个字段上取值相同的记录,系统再按照第二 个字段的取值排序,以此类推。因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用。因此将应用频度高的字段,放置在复合索引的前面,会使 系统最大可能地使用此索引,发挥索引的作用。

4.删除不再使用,或者很少被使用的索引。表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再被需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

### MySQL 索引创建的最佳实践和原则 #### 1. **选择高频查询条件的列** 为了提高查询效率,应在经常出现在 `WHERE` 子句、`JOIN` 操作或 `ORDER BY` 子句中的列上创建索引。这种做法有助于减少扫描整个表的时间成本[^3]。 ```sql -- 示例:在频繁使用的列上建立索引 CREATE INDEX idx_order_status ON orders(status); ``` --- #### 2. **优先考虑唯一性和数据分布** 对于具有较高唯一性的列(如主键或带有唯一约束的列),创建唯一索引是非常有效的。此外,还需关注列中值的分布情况;如果某列的值分布较为均匀,则在此基础上构建索引通常能带来更好的性能收益[^3]。 ```sql -- 创建唯一索引示例 ALTER TABLE users ADD UNIQUE (email); -- 查看某一列的数据分布状况 SELECT column_name, COUNT(*), COUNT(DISTINCT column_name) FROM table_name GROUP BY column_name; ``` --- #### 3. **针对大表优化** 随着表规模的增长,全表扫描所带来的开销也逐渐增加。因此,在处理大规模数据集时,合理运用索引显得尤为重要。然而,对于较小的表来说,全表扫描可能是更加经济实惠的方式。 --- #### 4. **平衡读写负载** 虽然索引能够显著加快读取速度,但它同样会对写入操作(包括插入、更新和删除)产生负面影响,因为每次变动都需要同步维护相应的索引树结构。所以在决定是否引入新索引之前,应当仔细衡量两者之间的利弊关系。 --- #### 5. **利用复合索引的优势** 当面对多字段组合筛选场景时,单一维度上的独立索引往往难以满足实际需求。这时可以通过定义复合索引来实现更精准的目标定位。值得注意的是,设计此类索引时需遵循“最左前缀法则”,即查询过程中至少包含第一个字段才可触发后续匹配过程[^3][^4]。 ```sql -- 定义复合索引 CREATE INDEX idx_user_date_amount ON trades(user_id, trade_date, amount); -- 利用复合索引进行高效查找 SELECT user_id, trade_date, amount FROM trades WHERE user_id = 1001 AND trade_date BETWEEN '2023-01-01' AND '2023-12-31'; ``` --- #### 6. **实施覆盖索引策略** 所谓覆盖索引是指所请求的信息完全由某个现有的二级索引所提供而无需再回到原数据行去获取更多信息的一种状态。这种方式极大地降低了磁盘I/O次数进而提升了整体响应时间[^1]. ```sql -- 覆盖索引的应用实例 CREATE INDEX idx_covering_example ON tb(col1, col2, col3, id); SELECT col1, col2, col3, id FROM tb WHERE col1=1 AND col2=2; ``` --- #### 7. **监控与调整** 最后但同样重要的一点就是持续跟踪应用程序的实际运行表现并通过分析慢查询日志等方式识别出哪些地方还有待改善空间。必要时候可以重新审视已有的索引布局并作出相应改动以适应不断变化的工作负荷特性[^2]. --- ### 结论 综上所述,制定科学合理的索引规划不仅需要充分理解业务逻辑同时也离不开扎实的技术功底支撑。只有做到理论联系实际才能真正发挥出MySQL索引机制的最大效能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值