什么时候用索引

1.原则上来说:一个表需要跟别人做连接的字段都要加索引,比如表A 的A1,A2,A3需要跟其他表发生连接,那么3个字段都要加索引

2.经常用来查询的字段,模糊查询的字段不用, 其他精确查询且字段重复率低的最好需要.比如 varchar字段

3.如果一个表经常用这个字段进行条件查询,这个字段是不是要加索引,要看这个字段的值是什么场景的,如果是枚举的,值是固定的几个,就没多大意义,如果是各式各样的,比如 varchar(100)里面的值重复很少,而且查询不是以like()进行 那么可以考虑加一加.

4.Mysql中Like查询 keyword%,走索引 %keyword%不走索引

5.比如用户名,创建时间,状态,很多常用的条件,就可以尝试建组合索引,注意Where顺序要一样,组合索引,要有组合字段被检索的场景才有用

6.数据重复多的话用位图索引

7.索引多了的表,不建议物理删除数据,最好逻辑删除,索引多了维护起来累,还有,建议索引不要跟数据在一个表空间(Oracle)

8.只要用索引就会拖慢插入 更新的速度,所以自己权衡好

9.每个表不超过三个索引,并不是建的越多性能越好,乱建索引会导致查询慢,具体请看执行计划

10.Oracle高版本按照CBO来优化的,如果CBO觉得不走索引快,那么你建再多的索引都没有用.

<think> 我们正在讨论的是在编程中何时使用索引器(即使用方括号`[]`)和点号(`.`)来访问对象成员。 根据之前的引用和编程知识,我们可以总结如下: 1. **点号访问(.)**:用于访问对象的已知属性或方法。这些属性或方法在编译时就是确定的,是类定义的一部分。 示例:`obj.Name`,其中`Name`是类的一个属性。 2. **索引器([])**:用于通过索引或键来访问集合中的元素。索引器通常用于数组、列表、字典等集合类型。 示例:`array[0]` 访问数组的第一个元素;`dictionary["key"]` 访问字典中键为"key"的值。 此外,自定义类也可以定义索引器,使得对象可以像数组一样被索引。例如,我们可以定义一个类,它内部封装了一个数组,然后通过索引器来访问数组元素。 因此,适用场景可以归纳为: - **使用点号(.)的场景**: - 访问对象的属性(字段或属性)。 - 调用对象的方法。 - 访问类的静态成员(通过类名点号)。 - **使用索引器([])的场景**: - 访问数组、列表等线性结构的元素(通过整数索引)。 - 访问字典、哈希表等键值对集合(通过键)。 - 自定义索引器,使对象支持类似集合的访问方式。 下面通过一个简单的例子来说明: ```csharp // 定义一个类,包含属性和索引器 public class MyClass { // 属性 public string Name { get; set; } // 内部数组 private int[] data = new int[10]; // 索引器:通过整数索引访问内部数组 public int this[int index] { get { return data[index]; } set { data[index] = value; } } } class Program { static void Main() { // 创建对象 MyClass obj = new MyClass(); // 使用点号设置属性 obj.Name = "Example"; // 使用索引器设置内部数组的元素 obj[0] = 42; // 使用点号访问属性 Console.WriteLine(obj.Name); // 使用索引器访问内部数组元素 Console.WriteLine(obj[0]); } } ``` 在上面的代码中: - `obj.Name` 使用点号访问属性。 - `obj[0]` 使用索引器访问内部数组的元素。 注意:索引器可以有多个参数,也可以重载(例如,同时支持整数索引和字符串键)。 引用说明: 引用[2]提到:对象通过对象引用访问,变量包含的是对象的引用,这种类型是引用类型。当我们需要直接访问对象的成员(属性、方法)时,使用点号。 引用[4]提到:在点号表示法中,操作的对象类型决定了可以访问的成员。索引器则提供了一种通过索引或键来访问元素的方式,常用于集合。 因此,总结如下: - 当访问对象固有的、已定义的成员(属性、方法)时,使用点号。 - 当访问集合中的元素(如数组、列表、字典)或自定义索引器时,使用方括号索引器。 相关问题: 1. 如何在自定义类中实现索引器? 2. 索引器和属性在实现上有何异同? 3. 在C#中,字典(Dictionary)和列表(List)的索引访问有何区别? 4. 为什么在访问对象的属性时通常使用点号而不是索引器? </think> # 编程中使用索引器 `[]` 与点号 `.` 的适用场景 在编程中,**索引器 `[]`** 和 **点号 `.`访问** 是两种不同的对象成员访问机制,各有明确的适用场景: ## 1. 点号访问 `.`(最常见) **适用场景**:访问对象的明确定义的属性和方法 - **静态成员访问**:访问类常量、静态属性等 ```csharp int boardSize = ChessBoard.SQUARES_PER_SIDE; // 引用[1] ``` - **实例属性/方法访问**:访问对象的公开成员 ```csharp string name = customer.Name; // 访问属性 customer.Save(); // 调用方法 ``` - **嵌套对象访问**:访问对象的子对象成员 ```csharp string city = order.Customer.Address.City; ``` **特点**: - **编译器检查**:成员存在性和类型安全性在编译时验证 - **高性能**:直接内存访问,无额外开销 - **强类型**:支持代码提示和自动完成 ## 2. 索引器访问 `[]`(特定场景) **适用场景**:访问集合类元素或自定义索引器 - **数组/列表访问**: ```csharp int first = numbers[0]; ``` - **字典/哈希表访问**: ```csharp string value = dictionary["key"]; ``` - **自定义索引器**: ```csharp public class Matrix { private int[,] data = new int[10,10]; public int this[int row, int col] { // 自定义索引器 get => data[row, col]; set => data[row, col] = value; } } Matrix m = new Matrix(); m[2, 3] = 42; // 使用索引器 ``` **特点**: - **动态访问**:支持运行时确定的键值 - **集合操作**:专为序列和映射设计 - **可重载**:支持自定义索引逻辑和多参数 ## 关键区别对比 | 特性 | 点号 `.` 访问 | 索引器 `[]` 访问 | |--------------|--------------------------|---------------------------| | **适用对象** | 所有对象 | 集合类/自定义索引器对象 | | **访问目标** | 属性/方法 | 集合元素/自定义索引值 | | **类型安全** | 编译时检查 | 运行时检查(可能出错) | | **性能** | 高效(直接访问) | 有额外开销(查找逻辑) | | **灵活性** | 固定成员 | 支持动态键值 | | **自定义** | 不支持重载 | 支持重载和多参数 | ## 最佳实践建议 1. **优先使用点号**. 访问对象的属性和方法(类型安全) 2. **仅在访问集合元素时使用索引器**(数组、字典等) 3. **避免混用**:当对象同时支持两种方式时: ```csharp // 不佳实践 ❌ var name = customer["Name"]; // 推荐实践 ✅ var name = customer.Name; // 点号访问属性 ``` 4. **为自定义类型谨慎实现索引器**,只有当类型具有集合语义时才使用 理解这些区别能帮助您编写更清晰、更高效的代码。在实际开发中,90%以上的场景应使用点号访问,仅在处理集合数据时使用索引器[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值