如果查询的两个表大小相当,那么用in和exists差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。 not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
N条独立索引同时在一条语句使用的消耗比只使用一个索引还要慢
MySQL5.0之后是有索引合并这个概念的,所以第一个问题解决了,MySQL可以同时使用多个索引
函数操作索引列:当对索引列进行函数操作时,索引可能会失效。例如,WHERE LOWER(column)、WHERE DATE(column) 等。
不满足最左前缀原则:如果在多列索引中,查询没有从最左边的列开始,索引也可能会失效。例如,如果有一个 (a, b) 的索引,但查询中只用到了 b 列,索引会失效。
使用!=或<>操作符:当使用 != 或 <> 操作符时,索引可能会失效。
列类型不匹配:如果查询时用到的列和索引列的类型不匹配,索引可能会失效。例如,如果索引列是字符串类型,但在查询中将其作为数字使用,索引会失效。
过滤条件中使用OR操作符:在过滤条件中使用 OR 操作符时,索引可能会失效。
隐式类型转换:当查询中的数据类型与索引列的数据类型不匹配,MySQL 可能会进行隐式类型转换,这会导致索引失效。
大范围查询:如果查询结果需要返回大部分数据,MySQL 可能会选择不使用索引。
数据分布不均匀:如果索引列的数据分布不均匀,可能会导致索引失效。
表中行数太少:对于行数太少的表,MySQL 可能会选择不使用索引。
在 InnoDB 存储引擎中,数据在磁盘上的存储方式是有序的,但并不是严格意义上的连续存储,而是通过 B+ 树的结构进行组织的。
虽然数据在 InnoDB 存储引擎中是以有序的方式存储的,但是在磁盘上的存储位置并不是严格连续的,而是受到多种因素的影响。
一个叶子节点中的多条数据通常是通过主键顺序来关联的
通过链表结构来关联的。这个链表是一个双向链表,每个数据记录都包含指向前一个和后一个数据记录的指针
默认隔离级别是可重复读
查看数据库隔离级别
show variables like 'transaction_isolation';
对于「读提交」和「可重复读」隔离级别的事务来说,它们的快照读(普通 select 语句)是通过 Read View + undo log 来实现的,它们的区别在于创建 Read View 的时机不同:
写入 redo log 的方式使用了追加操作, 所以磁盘操作是顺序写,而写入数据需要先找到写入位置,然后才写到磁盘,所以磁盘操作是随机写。
磁盘的「顺序写 」比「随机写」 高效的多,因此 redo log 写入磁盘的开销更小。
不是的。
实际上, 执行一个事务,产生的 redo log 也不是直接写入磁盘的,因为这样会产生大量的 I/O 操作,而且磁盘的运行速度远慢于内存。
所以,redo log 也有自己的缓存—— redo log buffer,每当产生一条 redo log 时,会先写入到 redo log buffer,后续在持久化到磁盘
redo log buffer 默认大小 16 MB,可以通过 innodb_log_Buffer_size 参数动态的调整大小,增大它的大小可以让 MySQL 处理「大事务」是不必写入磁盘,进而提升写 IO 性能
缓存在 redo log buffe 里的 redo log 还是在内存中,它什么时候刷新到磁盘?
主要有下面几个时机:
事务提交后,redo log 和 binlog 都要持久化到磁盘,但是这两个是独立的逻辑,可能出现半成功的状态,这样就造成两份日志之间的逻辑不一致。
将 redo log 的写入拆成了两个步骤:prepare 和 commit,中间再穿插写入binlog,具体如下:
关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所
以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操
作需要消耗额外的 IO,会降低增/改/删的执行效率。所以,在我们删除数据库
百万级别数据的时候,删除数据的速度和创建的索引数量是成正比的。
顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where 子句
中使用最频繁的一列放在最左边。
最左前缀匹配原则,非常重要的原则,MySQL 会一直向右匹配直到遇到范围查
询(>、<、between、like)就停止匹配,比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d 是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d 的顺序可以任意调整。
=和 in 可以乱序,比如 a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,MySQL 的查询优化器会帮你优化成索引可以识别的形式。
MySQL 在得到一个执行请求后,会首先去查询缓存 中查找,是否执行过这条SQL 语句,之前执行过的语句以及结果会以 key-value 对的形式,被直接放在内存中。key 是查询语句,value 是查询的结果。
如果通过 key 能够查找到这条 SQL 语句,就直接妾返回 SQL 的执行结果。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果就会被放入查询缓存中。可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,效率会很高。
什么是临时表?MySQL 在执行 SQL 语句的过程中 通常会临时创建一些存储中间结果集的表,临时 表只对当前连接可见,在连接关闭时,临时表会被删除并释放所有表空间。
临时表分为两种:一种是内存临时表,一种是磁盘临时表,什么区别呢?内存临时表使用的是MEMORY 存储引擎,而临时表采用的是 MylSAM 存储引擎。
MySQL 会在下面这几种情况产生临时表。
(1)B树的树内存储数据,因此查询单条数据的时候,B树的查询效率不固定,最好的情况是O(1)。我们可以认为在做单一数据查询的时候,使用B树平均性能更好。但是,由于B树中各节点之间没有指针相邻,因此B树不适合做一些数据遍历操作。
(2)B+树的数据只出现在叶子节点上,因此在查询单条数据的时候,查询速度非常稳定。因此,在做单一数据的查询上,其平均性能并不如B树。但是,B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询。
因此,我们可以做一个推论:没准是Mysql中数据遍历操作比较多,所以用B+树作为索引结构。而Mongodb是做单一查询比较多,数据遍历操作比较少,所以用B树作为索引结构。
处理思路:
所有查询都很慢
定位慢查询sql语句慢查询日志
通过explain 分析sql语句执行 explain的字段含义参考
possible_keys:可能用到的索引
key: 实际使用的索引
Extra:额外信息,如Using index、Using where等
参考慢查询
查询开启慢查询日志
show variables like '%slow_query_log%';
set global slow_query_log='ON';
设置慢查询时间 单位:秒,默认10秒
set global long_query_time=1;
查看当前Mysql所有的进程
show processlist;
查看Mysql的最大缓存
show global variables like "global max_allowed_packet"
查看当前正在进行的事务
select * from information_schema.INNODB_TRX
查看当前Mysql的连接数
show status like 'thread%'
总结可能原因
索引问题: 如果数据库表没有正确的索引,或者索引失效,数据库查询将会变得很慢。这可能是由于索引损坏、删除或者数据库统计信息不准确导致的。
查询语句问题:查询语句的性能也可能会导致查询变慢。例如,复杂的查询、未优化的查询、大量的JOIN操作或者子查询等。
数据量增加:当数据库中的数据量增加时,查询可能会变慢。这可能是由于增加的数据量导致索引效率降低,或者查询需要处理更多的数据导致的。
硬件资源问题:数据库运行所在的服务器硬件资源不足,例如CPU、内存、磁盘I/O等,都可能导致查询变慢。
锁和并发问题:如果数据库中有大量的并发查询或者事务,可能会导致锁竞争,进而影响查询的性能。
数据库配置问题:数据库配置不当也可能导致查询变慢。例如,内存配置不足、缓冲池设置不当、日志设置不当等。
网络问题:如果数据库连接存在网络延迟或者带宽限制,也会导致查询变慢。
指的是 MySQL 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上。
文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99
文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效
文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是
文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件
文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件
文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码
文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware
文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停
文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待
文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析
文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code
文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象