如何优化sql,效率最高,SQL索引优化

索引概念和作用
索引是一种使记录有序化的技术,它可以指定按某 列/某几列预先排序,从而大大提高查询速度(类似 于汉语词典中按照拼音或者笔画查找)。
索引的主要作用是加快数据查找速度,提高数据库 的性能。

MySQL索引类型
从物理存储角度上,索引可以分为聚集索引和非聚 集索引。
1.聚集索引(Clustered Index)
聚集索引决定数据在磁盘上的物理排序,-个表只 能有一个聚集索引。
2.非聚集索引(Non-clustered Index)
引上只包含被建立索引的数据,以及一个行定位符 row-locator, 这个行定位符,可以理解为一个聚集 索引物理排序的指针,通过这个指针,可以找到行 数据

从逻辑角度,索引可以分为以下几种。
1.普通索引:最基本的索引,它没有任何限制。2.唯一索引:与普通索引类似,不同的就是索引 列的值必须唯一-, 但允许有空值。如果是组合 索引,则列值的组合必须唯-
3.主键索引:它是一种特殊的唯一 索引,用于唯ll 一标识数据表中的某一条记录, 不允许有空 值,- -般用primary key来约束。主键和聚 集索引的关系详见"问题详解”中的第4题。4.联合索引(又叫复合索引) :多个字段上建立 的索引,能够加速复合查询条件的检索。5.全文索引:老版本 MySQL自带的全文索引 只能用于数据库引擎为MyISAM的数据表, 新版本MySQL 5.6的InnoDB支持全文索引 默认MySQL不支持中文全文检索,可以通过 扩展MySQL,添加中文全文检索或为中文内 容表提供对应的英文索引表的方式来支持

MySQL索引优化规则
可以通过以下规则对MySQL索引进行优化。
1.前导模糊查询不能使用索引。
例如下面SQL语句不能使用索引。
select * fromdoc where title like '%XX’ 而非前导模糊查询则可以使用索引,如下面的SQL 语句。
select * fromdoc where title like ‘XX%’
页面搜索严禁左模糊或者全模糊,如果需要可以用 搜索引擎来解决。
2.union、 in、 or 都能够命中索引,建议使用in。
示例代码如下:
select * fromdoc where status=1
unionall
select * fromdoc where status=2
直接告诉MySQL怎么做,MySQL 耗费的CPU最 少,但是-般不这么写sQL。
●in:能够命中索引。.
示例代码如下:
select * fromdoc where status in (1, 2) 查询优化耗费的CPU比union all多,但可以忽略 不计,一般情况下建议使用in
●or:新版的MySQL能够命中索引。
示例代码如下:
select * fromdoc where status= 1 or status =2 查询优化耗费的CPU比in多,不建议频繁用or。3.负向条件查询不能使用索引, 可以优化为in查 询
负向条件有: !=、<>、not in、not exists、not like 等
例如下面代码:
select * fromdoc where status != 1 and status != 2 可以优化为in查询:
select * fromdoc where status in (0,3,4)
4.联合索引最左前缀原则(又叫最左侧查询)
●如果在(a,b,c)三个字段上建立联合索引,那么 它能够加快a I(a,b) |(a,b,c)三组查询速度。
例如登录业务需求,代码如下。
selectuid,
login_ time from user where login. name=? andpas 可以建立(login name, passwd)的联合索引。
因为业务上几乎没有passwd的单条件查询需求, 而有很多login
name的单条件查询需求,所以可
(passwd, login. name)。
●建联合索引的时候,区分度最高的字段在最左
●如果建立了(a,b)联合索引,就不必再单独建立 a索引。同理,如果建立了(a,b,c)联合索引,
就不必再单独建立a、(a,b) 索引。
●存在非

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server索引优化是提高数据库查询性能的关键环节,它涉及创建、管理和维护适当的索引,以减少数据访问时间。以下是SQL Server索引优化的一些关键方面: 1. **理解索引类型**: - **B-Tree索引(默认)**:数据按排序顺序存储,适用于范围查询和等值查询。 - **哈希索引**:用于等值查找,但不支持范围或排序操作,主要用于全文索引或唯一键。 - **Clustered索引**:决定了表的物理顺序,每个表只能有一个,选择主键作为clustered index通常最佳。 - **Non-Clustered索引**:独立于表的物理结构,可以有多个。 2. **创建索引策略**: - 为频繁查询的列创建索引。 - 避免在包含大量重复值的列上创建索引,因为它们效率低。 - 尽量使用覆盖索引,减少表扫描。 3. **考虑索引宽度**: - 索引列越少,查询效率越高,但过多列可能导致索引过大,增加磁盘空间占用。 4. **评估索引分布**: - 确保索引列上有均匀分布的数据,避免聚集簇状索引中的数据过于集中。 5. **使用统计信息**: - SQL Server使用统计信息来估计查询性能,定期更新统计信息以保持其准确。 6. **避免过度索引**: - 创建过多索引会消耗存储空间且查询解析复杂度增加,需权衡利弊。 7. **索引合并(Index Rebuild或Reorganize)**: - 定期执行以优化物理结构,提高查询性能。 8. **使用覆盖索引或非覆盖查询**: - 覆盖索引仅包含查询所需数据,避免了回表,提高性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值