首页技术mysql优化,mysql面试必会100道题

mysql优化,mysql面试必会100道题

编程之家2026-06-231201次浏览

大家好,今天小编来为大家解答以下的问题,关于mysql优化,mysql面试必会100道题这个很多人还不知道,现在让我们一起来看看吧!

mysql优化,mysql面试必会100道题

mysql数据库的优化方法

我们都知道,服务器数据库的开发一般都是通过java或者是PHP语言来编程实现的,而为了提高我们数据库的运行速度和效率,数据库优化也成为了我们每日的工作重点,今天,回龙观IT培训就一起来了解一下mysql服务器数据库的优化方法。

为什么要了解索引

真实案例

案例一:大学有段时间学习爬虫,爬取了知乎300w用户答题数据,存储到mysql数据中。那时不了解索引,一条简单的“根据用户名搜索全部回答的sql“需要执行半分钟左右,完全满足不了正常的使用。

案例二:近线上应用的数据库频频出现多条慢sql风险提示,而工作以来,对数据库优化方面所知甚少。例如一个用户数据页面需要执行很多次数据库查询,性能很慢,通过增加超时时间勉强可以访问,但是性能上需要优化。

索引的优点

mysql优化,mysql面试必会100道题

合适的索引,可以大大减小mysql服务器扫描的数据量,避免内存排序和临时表,提高应用程序的查询性能。

索引的类型

mysql数据中有多种索引类型,primarykey,unique,normal,但底层存储的数据结构都是BTREE;有些存储引擎还提供hash索引,全文索引。

BTREE是常见的优化要面对的索引结构,都是基于BTREE的讨论。

B-TREE

查询数据简单暴力的方式是遍历所有记录;如果数据不重复,就可以通过组织成一颗排序二叉树,通过二分查找算法来查询,大大提高查询性能。而BTREE是一种更强大的排序树,支持多个分支,高度更低,数据的插入、删除、更新更快。

mysql优化,mysql面试必会100道题

现代数据库的索引文件和文件系统的文件块都被组织成BTREE。

btree的每个节点都包含有key,data和只想子节点指针。

btree有度的概念d>=1。假设btree的度为d,则每个内部节点可以有n=[d+1,2d+1)个key,n+1个子节点指针。树的大高度为h=Logb[(N+1)/2]。

索引和文件系统中,B-TREE的节点常设计成接近一个内存页大小(也是磁盘扇区大小),且树的度非常大。这样磁盘I/O的次数,就等于树的高度h。假设b=100,一百万个节点的树,h将只有3层。即,只有3次磁盘I/O就可以查找完毕,性能非常高。

索引查询

建立索引后,合适的查询语句才能大发挥索引的优势。

另外,由于查询优化器可以解析客户端的sql语句,会调整sql的查询语句的条件顺序去匹配合适的索引。

mysql 优化包括哪些内容

mysql的优化大的有两方面:

1、配置优化

配置的优化其实包含两个方面的:操作系统内核的优化和mysql配置文件的优化

1)系统内核的优化对专用的mysql服务器来说,无非是内存实用、连接数、超时处理、TCP处理等方面的优化,根据自己的硬件配置来进行优化,这里不多讲;

2)mysql配置的优化,一般来说包含:IO处理的常用参数、最大连接数设置、缓存使用参数的设置、慢日志的参数的设置、innodb相关参数的设置等,如果有主从关系在设置主从同步的相关参数即可,网上的相关配置文件很多,大同小异,常用的设置大多修改这些差不多就够用了。

2、sql语句的优化

1)尽量稍作计算

Mysql的作用是用来存取数据的,不是做计算的,做计算的话可以用其他方法去实现,mysql做计算是很耗资源的。

2)尽量少 join

MySQL的优势在于简单,但这在某些方面其实也是其劣势。MySQL优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在 Join这方面所下的功夫还不够,所以性能表现离 Oracle等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈

3)尽量少排序

排序操作会消耗较多的 CPU资源,所以减少排序可以在缓存命中率高等 IO能力足够的场景下会较大影响 SQL的响应时间。

对于MySQL来说,减少排序有多种办法,比如:

通过利用索引来排序的方式进行优化

减少参与排序的记录条数

非必要不对数据进行排序

4)尽量避免 select*

在数据量少并且访问量不大的情况下,select*没有什么影响,但是量级达到一定级别的时候,在执行效率和IO资源的使用上,还是有很大关系的,用什么字段取什么字段,减少不必要的资源浪费。

5)尽量用 join代替子查询

虽然 Join性能并不佳,但是和 MySQL的子查询比起来还是有非常大的性能优势。MySQL的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,但是到目前已经发布的所有稳定版本中都普遍存在,一直没有太大改善。虽然官方也在很早就承认这一问题,并且承诺尽快解决,但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题。

mysql对于大量数据,怎么进行优化

1)调整服务器的性能参数:key_buffer_size、Innodb_buffer_pool_size进行合理的配置

2)建立合适的索引

3)写查询语句用explain分析一下执行过程,核实一下执行计划,是否按照自己的意愿执行。

索引使要注意的地方:

1)索引不会包含有NULL值的列(使用索引的列设需要置默认值) 2)使用短索引 3)不要在列上进行运算,即操作符号左端(使用函数) 4) like语句操作 5)不使用NOT IN和<>操作 6)复合索引的建立 7)选择自己使用的索引: USEINDEX, IGNOREINDEX, FORCEINDEX 8) where子句中已经使用了索引的话,那么order by中的列是不会使用索引的(使用复合索引解决)

表扫描要注意的地方:

1)数据表很小,全表扫描比做索引键的查找来得快。当表的记录总数小于10且比较短时通常这么做。

2)没有合适用于 ON或 WHERE分句的索引字段。

3)让索引字段和常量值比较,MySQL已经计算(基于索引树)到常量覆盖了数据表的很大部分。

4)通过其他字段使用了一个基数很小(很多记录匹配索引键值)的索引键。这种情况下,MySQL认为使用索引键需要大量查找,还不如全表扫描来得更快。

5)使用合适的索引可以解决表扫描

6)使用Limit有时候也可以解决表扫描

优化的地方太多了,一一列举不完,你可以去这里看一下,这里面关于优化的知识有很多

,如果觉得说的有用就给个好评,写这么多怪不容易的,用了我一刻钟的时间呀

关于mysql优化的内容到此结束,希望对大家有所帮助。

dnf石头?dnf藤蔓根茎ai在线作图 哪一款ai作图工具在线免登录