自己整理的MySQL有关的知识点(自用勿转!!!)

数据库的优化---------希望查询数据的速度能尽可能的快,从查询算法的角度进行优化,但是实际的数据库系统几乎没有使用二叉查找树或其进化品种红黑树(red-black tree)实现的

1.全表扫描的意思就是要把表中所有数据过一遍才能显示数据结果,索引扫描就是索引,只需要扫描一部分数据就可以得到结果, 打个比方吧,在新华字典中,如果没有拼音或笔画索引,当我们查找“做”这个字就要从字典第一页一次往后查,一直插到Z开头的部分才能找到,即使找到也不确定后面是不是还有(假定字典是无序状态的),因此还得往后找,知道正本字典翻完,才确定“哦,原来刚才找到的那个记录就是想要的结果了”。
索引扫描(索引的本质是数据结构)的意思就是我们预先知道“做”这个字在拼音的Z区域,然后根据前面目录查看"zuo"这个拼音在那一页,然后直接翻到那一页就能找到我们要的结果了,这样就能大大减少查询的时间
一。什么是数据库执行计划
利用一个SQL语句, 你可能要Server取出所有News表中的信息. 当Server收到的这条SQL的时候, 第一件事情并不是解析它. 如果这条SQL没有语法错误, Server才会继续工作. Server会决定最好的计算方式. Server会选择, 是读整个News表好呢, 还是利用索引会比较快些. Server会比较所有可能方法所耗费的资源. 最终SQL语句被物理性执行的方法被称做执行计划或者是查询计划(数据库服务器在执行sql语句之前会制定几套执行计划!看那个机会消耗的系统资源少,就是用那套计划!)
二。执行计划的生成方法:
explain select …………….(在相应的select前面加explain即可)

MYSQL 用 explain 语句判断select查询是否使用了索引
截图
截图

2.对于IN和EXISTS的性能区别
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应用in,反之如果外界的主查询较少,子查询中的表大,又有索引时使用EXISTS。
其实我们区分IN和EXISTS主要是造成了驱动顺序的改变(这是性能的关键),如果是EXISTS,那么以外的外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引到索引及结果集的关系了。
另外IN是不对NULL进行处理。

IN:确定给定的值是否与子查询或列表中的值相匹配。
EXISTS:指定一个子查询,检测行的存在。

3.MySQL为什么要用B树/B+树?

红黑树等数据结构也可以用来实现索引,但是文件系统以及数据库系统普遍采用B树或者B+树,这一节将结合计算机组成原理相关知识讨论B-/+Tree作为索引的理论基础。
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级(磁盘I/O存在机械运动耗费,导致时间消耗巨大),所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

4.B/B+树索引的性能分析
数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。
5.MYSQL索引实现
在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,MyISAM(B+树)和InnoDB两个存储引擎的索引实现方式

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分
在这里插入图片描述
在这里插入图片描述

第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这种索引叫做聚集索引,必须有主键!!!一般不用辅助索引,可能会使B+树的效率低下。
在这里插入图片描述
在这里插入图片描述

慢查询日志概念
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。
默认不调用慢查询日志,需要手动调用;(如果不是调优的话,一般不启动慢查询日志!!!)会影响性能!

慢查询日志的记录方式:
慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

慢查询日志相关参数
MySQL 慢查询的相关参数解释:
1.slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。
slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。
2.log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
3.slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
4.long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。
5.log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。
6.log_output:日志存储方式。log_output=‘FILE’表示将日志存入文件,默认值是’FILE’。log_output='TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=‘FILE,TABLE’。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到件。
7. log-queries-not-using-indexes:未使用索引的查询也被记录到慢查询日志中(可选项)
8.slow_queries:查询有多少条慢查询,如果你想查询有多少条慢查询记录

定位慢SQL,并优化
这是最常用、每一个技术人员都应该掌握基本的SQL调优手段(包括方法、工具、辅助系统等)。这里以MySQL为例,最常见的方式是,由自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain、profile等工具来逐步调优,最后经过测试达到效果后上线。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值