如何建立索引

关于如何建立索引,及哪些情况适合使用索引,哪些情况不适合使用索引,各种书籍资料有很多。

 

但是最重要的原则是:实际测试。

 

实践是检验真理的唯一标准。建立索引的时候,应进行如下测试:

1 explain select语句,看看是否有使用到索引。

2 运行update和insert操作,看看建立索引的负效应是否在可接受范围。

3 务必在接近生产环境的数据规模下进行索引性能的测试。

 

第三点尤为重要。

因为在最近的项目优化过程中,发现:

在某个字段上建立了索引之后,如果是select返回30条记录,建立索引之后,select时间降到原来的1/6。提高很明显。

而在生产环境下,这个select需要返回的结果通常是上千(甚至上万的),建立索引之后,select的时间反而增加了快一倍。因此建立索引反而适得其反。

 

分析后觉得可能的原因如下:

1 该字段建立索引之后,基数并不高,也就是该字段的重复率较高,索引对性能的提升不明显。简单说,比如一个字段是:性别,只有男女两种情况,那建立索引完全没必要,反而降低了性能。

 

2 该select要返回的结果集很大(超过了1000条记录)。在这种情况下,mysql先查询索引,而后根据索引到表中取得记录,这个操作在需要取得的记录非常多的情况下,非常耗时。最终导致了:建立索引之后,select时间反而增加的情况。

 

这次的主要原因是2.  因为还进行了如下测试:如果该select语句只返回30条记录,建立索引之后,select时间为原来的1/6。

 

 

建立索引要注意的地方很多,最重要的原则还是:实际测试。

 

### 如何在数据库中创建索引 #### 使用 `CREATE INDEX` 命令创建索引 可以利用 SQL 中的 `CREATE INDEX` 语句来定义新的索引。对于希望加速查询性能的特定字段,此命令允许指定这些字段作为索引的一部分[^2]。 例如,在名为 `mytable` 的表上基于 `username` 字段创建一个唯一性索引: ```sql CREATE UNIQUE INDEX indexName ON mytable(username(length)); ``` 这里的关键字 `UNIQUE` 表明该索引不允许重复值的存在;而 `(length)` 参数则限定了用于构建索引的最大字符数[^1]。 #### 定义新表的同时设置索引 当首次设计数据结构初始化表格时,可以在同一SQL指令内声明多个约束条件以及任何所需的索引。下面的例子展示了如何在一个新建的数据集中加入两种类型的索引——常规索引和唯一性索引: ```sql CREATE TABLE my_table ( id INT PRIMARY KEY, name VARCHAR(50), age INT, INDEX idx_name (name), -- 创建普通索引 UNIQUE INDEX idx_age (age) -- 创建唯一索引 ); ``` 这段代码片段不仅建立了基本架构还同步设置了针对 `name` 和 `age` 列的不同形式的索引[^3]。 #### 对现有表添加索引 如果已经存在一张未加索引的表,则可通过修改其结构的方式来增加必要的索引支持。通过执行如下所示的 `ALTER TABLE` 操作即可实现这一目标: ```sql ALTER TABLE existing_table ADD INDEX(index_column); ``` 上述命令会向现有的 `existing_table` 添加一个新的非唯一索引到 `index_column` 上。 #### 复合索引的应用场景 有时为了优化涉及多列组合查找效率的情况,还可以考虑建立复合索引。比如给定一个学生信息记录表 `t_index` ,其中包含学号 (`sno`) 及姓名 (`name`) 这两列,可以通过以下方式为其联合创建索引来提高检索速度: ```sql create index t_index_sno_name on t_index(sno,name); ``` 这种做法特别适用于那些经常一起被用来过滤果集的情形之下[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值