如果查询的两个表大小相当,那么用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 的写操作并不是立刻更新到磁盘上,而是先记录在日志上,然后在合适的时间再更新到磁盘上。
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland