当前位置: 首页 > 科技观察

关于SQL优化,你不能只是说自己只会语句的优化了

时间:2023-03-15 16:08:40 科技观察

关于SQL优化,不能说只知道优化语句。只有掌握了才能拿到好的offer不是吗?大部分人说SQL优化阿芬之前为公司面试过一些人。因为之前面试过老板,也看过很多人的简历,而简历关于网上数据库的内容,很多人都是这样写的。熟练使用MySQL、SQLServer,熟悉Oracle,熟悉SQL语句优化。确实,如果你对数据库没有深入的了解,你是不敢在上面写的,只能写SQL语句的优化,但是很多时候,你写完这条SQL语句,你是不会的主动优化。大多数时候,我会停下来。如果没有问题,我不会更改它。只要功能实现了,那就万事大吉了。而这篇文章,告诉你,不要只优化SQL语句。SQL语句优化我们在面试的时候,面试官看到你写了SQL语句优化,有时候会发问。然后说说SQL语句优化的几个方面。关于SQL语句的优化,内容比较多。优化查询,尽量避免全表扫描,首先考虑在where和orderby涉及的列上建索引。尽量避免在where子句中使用!=或<>运算符,否则引擎会放弃使用索引而进行全表扫描。尽量避免在where子句中判断字段的空值,否则引擎会放弃使用索引,进行全表扫描。.....像这样的SQL语句优化还有很多,但是大家有没有注意到我上面标注的,引擎呢?让我们快速分析一下。以下MySQL系统全文均根据MySQL进行分析。对于分析引擎,我们先从MySQL来分析。MySQL的架构图如下:从图中我们可以看到一些内容,比如MySQL的组成部分。连接池组件管理服务和工具组件SQL接口组件查询分析器组件优化器组件缓存(Cache)组件插件存储引擎物理文件不得不说,这个插件存储引擎总结得非常出色。MySQL数据库与其他数据库的区别之一是它的插件表存储引擎。但是我们要注意一件最重要的事情,就是存储引擎是基于表的,而不是数据库。MySQL存储引擎存储引擎是MySQL区别于其他数据库的最重要的特性之一。每个存储引擎都有自己的特点,不同的场景会用到不同的特点。虽然我们在开发中经常会用到它,但是能够根据具体的应用创建不同的存储引擎表,这个才是最牛逼的。然后看看MySQL支持哪些存储引擎,在自己的MySQL中手动输入查询语句showengines,如下图。看完是不是觉得挺多的,但是MySQL的9个存储引擎各有特点,然后根据不同的需求,我们在建表的时候可以选择,有没有和妹子找到另一个的?好机会,那就开始分析吧。1.FEDERATEDstorageengine之前看书的时候看到这个,说这个引擎不是存储数据的引擎,而是指向远程MySQL数据库服务器的引擎。这意味着什么?其实说白了就是:“我这里不存放表结构文件和数据文件,我存放在远端”。这时候,有一个比较有意思的地方,如下图所示:如图所示,FEDERATED存储引擎分为两部分。一部分是本地服务,另一部分是远程服务,所以如果切换到这个引擎,它在执行增删改查的时候,会把执行操作的命令发送到远程服务器,然后再发回给本地服务器执行后,然后从本地服务器返回匹配的行。这里阿芬就不重点说这个了,因为重点是我们最常使用的,想必大家都知道它就是InnoDB存储引擎。2、InnoDB存储引擎InnoDB存储引擎这个一般是大家在面试的时候经常可以和面试官聊到的,因为它是默认的数据库存储引擎。注意默认是从MySQL5.5.8开始有很多特性。下面开始分析特征。支持交易。默认的事务隔离级别是可重复的,我们经常用到,所以大家都知道。支持外键,大家肯定都知道这个外键,有优点也有缺点,毕竟外键的作用放在那里(好处:增加可读性,如果出现宕机,最大保证数据的一致性和完整性extent,缺点:表的查询速度降低,如果数据太大,那么你插入数据库数据的时间可能比不加外键的时间长十倍)行锁设计,可以支持更高的并发,这就是为什么有时候面试官说你在ES上有点大材小用了,因为MySQL自己能搞定这么多。使用多版本并发控制(MVCC)实现高并发,实现SQL标准的4个隔离级别,默认为REPEATABLEREAD级别。使用一种叫做next-keylocking(也有人称之为gaplock)的策略来避免幻读(phantom)现象数据存储采用集群的方式,每张表的存储都是按照主键顺序存储的。InnoDB的索引结构不同于MySQL的其他存储引擎。聚簇索引对主键的查询性能非常高。这时候,就必须有一个限制条件。如果表上有很多索引,主键应该越小越好。InnoDB通过一些机制和工具支持真正的热备份,即在线热备份。数据存储在表空间中,表空间实际上是InnoDB管理的一个黑盒子,由一系列文件组成。2.1InnoDB架构从上图我们可以看出,InnoDB存储引擎有很多内存块。可以认为这些内存块其实相当于一个大内存池,也就是线程池类似。既然在图中,我们看到了后台线程,那我们就来说说这个后台线程是什么。InnoDB存储引擎是多线程模型,所以后台有多个不同的后台线程,分别负责处理不同的任务。而这个后台线程也分为两部分,一个是核心线程,一个是IO线程。CoreThreadMasterThreadIOThreadIOThreadPurificationThreadPurgeThreadCleanupThreadPageCleanerThreadCoreThread核心线程的作用是将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。IO线程IO线程很简单,主要用于IO请求的回调处理。清理线程的主要作用是在事务提交后回收已使用和分配的undopage清理线程。它的作用是将之前版本中的脏页刷新操作放到一个单独的线程中去完成。如果阿芬能在面试的时候跟面试官解释清楚这些事情,我相信薪水肯定会更高。3.Memory存储引擎Memory存储引擎实际上是将表中的数据存储在内存中。如果数据库重启或崩溃,表中的数据就会消失。也就是说,如果你的数据存储在Memory存储引擎里,如果机房不小心断电了,就完了,之前存在里面的东西就没了。这和你使用rm-rf是一样的,但一个是被动的。是的,一个是活跃的。这种设备很少用到,就不给大家介绍了,只说说它的特点。毕竟,如果您关闭设备,它会立即消失。不支持TEXT和BLOB类型,对于string类型数据,只支持定长行,VARCHAR会自动存储为CHAR类型;速度很快,只支持表锁,并发性能差,不支持TEXT和BLOB,一旦列型服务器宕机,所有数据都会消失。在存储变长字段(varchar)时,是按照常量字段(char)的方式进行的,所以会浪费内存。4、MyISAM存储引擎特点明显,不支持。事务,但支持全文检索,必须面向一些OLAP(OnlineAnalyticalProcessing)数据库应用。5.BLACKHOLE存储引擎这个引擎就像它的名字一样,肉包子打狗,没有回报,它的使用比较简单SQL文件语法的校验,用于发现与存储引擎本身无关的性能瓶颈.6.CSV存储引擎CSV存储引擎实际上操作的是一个标准的CSV文件,它的特点是不支持索引,也就是不支持Index,那么效率必然会很低,相信很多人都会不选择使用它。对于这些引擎,阿芬说,既然学了这么多,就不要再继续说我们的SQL优化了。面试的时候一定要有针对性。比如在面试的时候,面试官问你:现在有一个功能,测试方的反馈是这个功能的响应时间超过了预期值。你从哪些方面着手处理这个问题。这道题看起来不是很难,但是可以在这道题的基础上延伸出很多很多的题。问题一:如果从SQL语句优化入手,那么就要检查索引,面试官的下一个问题可能是,为什么加了索引后速度会变快。问题2:如果说服务器的配置,面试官可能心里想,为了一个功能反馈,你让我给服务器加配置,太贵了。如果你还没有深入了解过索引,这时候可以优化一下SQL语句,看看能不能修改数据库表的引擎。如果是这样,那么您就可以开始利用这些SQL引擎的优势朝着自己的方向发展了。