java面试 Sql优化问题

本文详细介绍了SQL优化中的索引知识,包括索引的类型如FULLTEXT、HASH、BTREE和RTREE,以及何时不适用索引。讨论了主键索引的作用和不同类型的索引选择,强调了避免全表扫描和不当使用索引可能导致的性能下降。此外,文章还提供了多种SQL优化技巧,如避免使用!=、LIKE通配符、函数操作索引列以及避免在WHERE子句中使用表达式等,旨在提升数据库查询效率。
摘要由CSDN通过智能技术生成

一.什么是索引:

索引分单列索引和组合索引:这里比较简单不解释。
创建索引:目的是为了提高查询条件,但是会降低增、删、改的时间。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
建立索引会占用磁盘空间的索引文件。

二、索引类型有那些

FULLTEXT全文索引

可以在REATE TABLE(创建表),ALTER TABLE(添加列),CREATE INDEX(创建索引)的适合使用,但是 CHAR、VARCHAR ,TEXT列表上的

HASH

几乎100%是唯一的,
HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

BTREE

BTREE将索引进行一段的算法,放到二叉树中,查询从root开始,遍历根茎,获取左边的数据。

RTREE

仅支持geometry数据类型,比喻说放经纬度,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。

三、索引种类

主键索引

提升查询数度、列表唯一,一张表中只能有一个索引
普通索引:加数查询条件,一般查询玩可以关掉索引
唯一索引:多查询、唯一,一个表中可以有多个,常用用平台id+手机号,可以实现,多平台,多商户,用户手机+平台id在整张表中的唯一性。

四、什么时候不使用索引

1、查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
2、很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
3、定义为text和image和bit数据类型的列不应该增加索引,
4、当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系

五、sql优化

[参考:“小米加大炮”大佬的文章]

1、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度
2、在where中避免null的判断,这也会降低查询效率
3、最好不要给数据库流null,尽可能的使用 NOT NULL填充数据库.NULL值也是可能会需要占用空间的,一些定长的数据类型即使数据为NULL也是会占用空间的。
4、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
5、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,可以使用union/union all 代替
6.in 和 not in 也要慎用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老徐··

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值