数据库慢查询介绍并优化

一.数据库查询慢的原因
我们可以把查询SQL执行看做是一个任务的话,那它是由一些列子任务组成的,每个子任务都存在一定的时间消耗。通常情况下,导致慢查询最根本的问题就是需要访问的数据太多,

导致查询不可避免的需要筛选大量的数据。
面对慢查询,我们需要注意以下两点:
(1)查询了过多不需要的数据
(2)扫描了额外的记

二.新数据库脚本慢,有何原因?
一个 SQL 执行的很慢,我们要分两种情况讨论:
1、大多数情况下很正常,偶尔很慢,则有如下原因
(1)、数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。
(2)、执行的时候,遇到锁,如表锁、行锁。
2、这条 SQL 语句一直执行的很慢,则有如下原因。
(1)、没有用上索引:例如该字段没有索引;由于对字段进行运算、函数操作导致无法用索引。
(2)、数据库选错了索引。
三.mysql中using的用法为:
using()用于两张表的join查询,要求using()指定的列在两个表中均存在,并使用之用于join的条件。
示例:
select a., b. from a left join b using(colA);
等同于:
select a., b. from a left join b on a.colA = b.colA;

四.索引的作用

  1. 索引是什么,首先我们可以举个例子,字典大家应该都使用过,我们可以使用目录快速定位到所要查找的内容,那么索引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录。

  2. 索引类型分类
    2.1 普通索引
    加快查询速度
    2.2 唯一索引
    加快查询速度,并且可以限制列值的唯一性,允许为空
    唯一索引包括联合唯一索引,多列形成的唯一索引,这些列可以唯一确定一条表记录,可以为空
    2.3 全文索引
    主要针对文本的内容进行分词,加快查询速度
    2.4 联合索引
    多列组成的索引,查询效率提升高于多个单列索引合并的效率
    2.5 主键索引
    主键唯一性,加快查询速度,不能为空

  3. 索引结构分类
    索引有很多分类,例如B-tree索引,哈希索引,全文索引等等,索引的实现是在存储引擎层,并不是在后端服务器层,所以不同的存储引擎支持的索引结构也不一定一样
    3.1 B-tree索引
    B-tree 索引普遍存在于存储引擎中,他使用B-tree数据结构来存储数据,如果对树形数据结构比较了解的话,就知道B-tree索引所带来的好处了,他的每个叶子节点都会包含下一个节点的指针,非常方便查询数据
    B-tree 适用于全键值,键值范围,或者前缀查找
    3.2 哈希索引
    哈希索引基于哈希表实现,对于每一行数据,存储引擎会对所有的索引列计算一个哈希码,然后存储引擎会基于这个哈希码来查找数据,小编感觉有点像HashMap 中槽的查询过程
    3.3 全文索引
    全文索引在几种索引结构类型中比较特殊,他查找的是文本中关键词
    4. 索引的正确使用
    索引是建立在系统文件上的,会占用一定的内存空间,另外数据在更新的时候也会去维护索引,消耗内存,所以索引一定要正确的使用,索引并不是越多越好,要根据具体的查询业务来规划索引的建立。
    建议不要使用索引的几种情况:

    1.区分度不是很大的字段,例如 性别 sex
    2.频繁更新的字段
    3.字符串类型的字段 或者 文本类型的字段
    4.不在where列中出现的索引
    索引失效的几种情况:
    1.查询列中有函数计算
    2. 查询列中有模糊查询,“%cloum”,可以使用"cloum%" 代替,如果要使用"%column%",那么select 列中是索引列
    3.如果查询条件中有or, 索引会失效,除非所有条件都加上索引
    4.使用不等于(!= 或者 <>)
    5.is null 或者 is not null
    6.字符串不加引号,会导致索引失效
    7.最左原则,联合索引中会遵循最左原则,即如果要使用联合索引,那么前面的索引列一定要包含,举个例子,
    有个联合索引(a,b,c) 那么查询条件中只能是 a=1 或者 a=1 and b=1 或者 a=1 and b=1 and c=1,不然索引就会失效

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值