使用索引的规则

群:127881306
1.索引对大表最有用,不要在小表上加索引.
2.为每个表中的主码指定一个唯一索引。
3.索引对于那些频繁出现在SQL命令中的where子句中的列最有用,不管这些列在选择中用来限定行还是为了表连接。
4.当一个属性中存在很多不同的值时,可以使用索引。Oracle建议当一个属性中有少于30个不同值时,索引不是很有用,当属性中有100或更多不同值时索引就很明显地有用了。相似地,只有当使用索引进行查询的结果不超过文件中所有记录总数的20%时,使用索引才有帮助。
5.检查你的DBMS对索引的限制,即便要在每个表允许的索引个数上。许多系统不超过16个索引而且限制每个索引键值的大小。对一个表创建的索引数一般不超过5个.
7. 对于包含空值的属性建立索引时要小心,在很多DBMS里有空值的行不能在索引中作为参照。
8. 时常需要做删除、更新、插入操作的表不要创建索引.
9. 将表和索引建立在不同的表空间内(TABLESPACES). 不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上.减少I/O竞争.
### 联合索引使用规则与最佳实践 联合索引是指在多个字段上创建的一个索引,MySQL 会按照索引定义中列的顺序来使用这些字段。为了正确使用联合索引并发挥其最性能,需要遵循一些规则和最佳实践。 #### 1. 最左前缀原则 联合索引遵循最左前缀原则,即查询条件必须从索引的第一个字段开始,并且连续使用索引字段[^1]。如果查询条件没有包含索引的第一个字段,或者中间某个字段被跳过,则后续字段无法被索引优化。例如,对于联合索引 `(col1, col2, col3)`: - 查询条件为 `WHERE col1 = ? AND col2 = ?` 时,索引会被完全利用。 - 查询条件为 `WHERE col2 = ?` 时,索引不会被利用。 - 查询条件为 `WHERE col1 = ? AND col3 = ?` 时,只有 `col1` 的部分会被利用。 #### 2. 全值匹配优化 全值匹配指的是尽可能多地使用联合索引中的字段。这样可以减少扫描的行数,提高查询效率。通过计算 `EXPLAIN` 中的 `key_len` 值,可以判断查询是否充分利用了联合索引的所有字段[^2]。例如,对于联合索引 `(col1, col2, col3)`,如果查询条件为 `WHERE col1 = ? AND col2 = ? AND col3 = ?`,则索引会被完全利用。 #### 3. 避免索引失效的情况 以下情况会导致联合索引失效: - **范围查询**:如果查询条件中存在范围查询(如 `>`、`<`、`BETWEEN` 等),则范围字段之后的字段无法被索引优化。 - **索引列运算**:如果对索引字段进行函数操作或达式运算(如 `WHERE YEAR(col) = 2023`),则该字段无法被索引优化。 - **字符串不引号**:如果字符串类型的字段未引号(如 `WHERE col = 123` 而非 `WHERE col = '123'`),可能导致索引失效。 - **模糊查询**:如果使用 `LIKE '%abc%'` 进行模糊查询,则索引无法被有效利用。 - **OR 连接条件**:如果查询条件中使用了 `OR`,并且 `OR` 的两个条件不能同时命中同一个索引,则索引可能失效。 #### 4. 覆盖索引 覆盖索引是指查询所需的字段都可以通过索引获取,而无需回查询数据文件。这可以显著减少 I/O 操作,提升查询性能。设计联合索引时,应尽量将查询中常用的字段包含在索引中,以实现覆盖索引的效果。 #### 5. 单列索引与联合索引的选择 单列索引适用于查询条件中仅涉及单一字段的场景,而联合索引更适合多字段查询。选择联合索引时,应根据查询条件的频率和字段的过滤性来决定索引字段的顺序。通常,过滤性更强的字段应放在索引的前面[^3]。 #### 6. 强制使用或忽略索引 如果发现 MySQL 未按预期使用联合索引,可以通过 `FORCE INDEX` 或 `IGNORE INDEX` 提示优化器强制使用或忽略特定索引[^3]。例如: ```sql SELECT * FROM table_name FORCE INDEX(index_name) WHERE col1 = ? AND col2 = ?; ``` #### 7. 索引设计原则 设计联合索引时,应遵循以下原则: - 根据查询条件的频率和过滤性选择索引字段。 - 尽量避免冗余索引,减少存储开销和维护成本。 - 定期分析查询计划 (`EXPLAIN`),评估索引的实际效果。 ```sql -- 示例:创建联合索引 CREATE INDEX idx_col1_col2_col3 ON table_name (col1, col2, col3); -- 示例:查询利用联合索引 SELECT * FROM table_name WHERE col1 = ? AND col2 = ? AND col3 = ?; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值