今天,我会告诉你如何回答这个问题。首先,我们要稳住,不要慌张。我正在自己做这个项目。第一个问题不能太大。第二题面试前需要做好充分的准备。。。答题前一定要了解查询的过程:查询由一系列子任务组成,包括从客户端到服务端,然后在解析服务器,生成执行计划,执行,返回结果给客户端。其中,“执行”可以认为是整个生命周期中最重要的阶段,它包括大量调用存储引擎检索数据和调用后的数据处理,包括排序和分组。为了完成这些任务,查询需要在各个地方花费时间,包括网络、CPU计算、生成统计信息和执行计划、锁等待操作。当执行一些不必要的额外操作或重复执行一些额外操作时,将消耗大量时间。查询性能不佳的最基本原因是访问的数据过多。某些查询可能不可避免地需要筛选大量数据,并且可以通过减少访问的数据量来优化大多数性能不佳的查询。低效查询可以分两步进行分析:1.确认应用程序是否正在检索比需要更多的数据。检查MySQL服务器是否正在解析比需要更多的行。以上都是理论。在实践中,MySQL的优化主要涉及SQL语句和索引的优化,以及数据表结构的优化。给大家推荐一个学习氛围很棒的地方,PHP通讯裙:点击进入,免费领取全套学习资料。裙子里有海量学习资料,有高手解答沟通问题,每晚还有免费优质腾讯直播课堂。SQL语句的优化:1.少用子查询尽量少用子查询,因为子查询会生成临时表;除非像count(*)这样的临时表非常小。2.少用SELECT*。每次看到SELECT*,都需要用怀疑的眼光看待它。您真的需要返回所有列吗?把所有的列都取出来会导致优化器无法完成索引覆盖扫描等优化,也会给服务器带来额外的I/O、内存和CPU消耗。3.查询必要的记录一个常见的错误是误以为MySQL只会返回需要的数据。其实MySQL是先返回所有的结果集,然后再计算。建议查询后加上LIMIT。4、不要重复查询相同的数据。重复执行相同的查询,然后每次都返回完全相同的数据。可以采用的方案是在第一次查询的时候缓存这条数据,需要的时候再从缓存中取出,这样性能显然会更好。5.COUNT查询优化COUNT()聚合函数的作用:统计某列值的个数,同时也统计行数。需要注意的是,在统计列值时,要求列值非空(不统计NULL),COUNT()查询的行越少越好。举个例子:如果我们直接去查id>100的记录,就会扫描到超过2000万行的记录。但是因为COUNT()的特性,我们可以使用count()——(id<100),这样只扫描100行。6、在Where子句中,where表之间的连接必须写在其他Where条件之前,那些能过滤出最大记录数的条件必须写在Where子句的末尾。HAVING是最后一个。7.将IN替换为EXISTS,将NOTIN替换为NOTEXISTS。8.避免在索引列上使用计算。9.避免在索引列上使用ISNULL和ISNOTNULL。10、优化查询,尽量避免全表扫描,首先考虑对where和orderby涉及的列建索引。11、尽量避免在where子句中判断字段的空值,否则引擎会放弃使用索引,进行全表扫描。12、尽量避免在where子句中对字段进行表达式操作,这样会导致引擎放弃使用索引而进行全表扫描。索引优化1.关联查询优化确保ON或USING子句的列上有索引。创建索引时,必须考虑关联顺序。当A表和B表关联c列时,如果优化器的关联顺序是B和A,那么只需要在A表上建立索引,无用的索引会占用存储空间。2.GROUPBY和DISTINCT优化??GROUPBY和DISTINCT最有效的优化是使用索引。所有用于分组的列都必须建立索引。例如:选择产品,count(*)fromordersgroupbyproduct;这样的查询需要为产品建立索引。3.LIMIT分页优化在进行分页操作时,通常会通过offsets来查询一些数据。然后再加上explainedorderby,性能总体不错。对于orderby这一列,一定要加索引。但是对于10000的限制,10条这样的检索目标10条记录必须先查询之前的10000条记录。成本很高,此时最简单的优化方式就是使用覆盖索引。注意索引的失效,1)以“%”开头的LIKE语句,模糊匹配2)OR语句前后不能同时使用索引3)存在数据类型的隐式转换(比如varchar不加单引号,可能会自动转成int类型)数据正确,因为它占用更少的磁盘、内存和CPU缓存。简单是最好的,选择整数而不是字符串,选择MySQL的内置类型而不是字符串来存储时间和日期,并使用整数作为IP地址。尽量避免NULL。许多表包含可以为NULL的列。这是因为NULL是列的默认值,您需要将列指定为NOTNULL。整型数据一般使用int,布尔型数据使用tinyint,但整型计算一般使用64位的BIGINT整数。当需要精确计算小数时,例如使用DECIMAL来存储财务数据(float和double类型的浮点数存储是不准确的),但是DECIMAL计算开销很大。您可以考虑使用BIGINT而不是DECIMAL。该数字乘以相应的倍数。varchar和char当需要存储可变长度的字符串时,使用varchar,它比使用char存储更节省空间。varchar使用1或2个额外的字节来记录长度。至于用char来存储,适合以下几种情况,一种是需要存储很短的字符串时(只存储Y和N值时),另一种是所有的值都接近一个固定长度(存储MD5值),第三个是经常需要改变的值。BIT在MySQL5.0之前,BIT是TINYINT的同义词。在MySQL5.0及更新的版本中,它是一种完全不同的数据类型。BIT类型的新行为:(1)BIT列可以用来在一列中存储一个或多个真/假值。MySQL将BIT视为字符串类型,而不是数字类型。检索BIT(1)的值时,结果是包含二进制0或1的字符串,而不是ASCII“0”或“1”。SET如果需要保存大量的true/false值,可以考虑将这些列合并成一个SET数据类型,在MySQL中用一系列packedbit表示。使用枚举而不是常用的字符串类型,因为MySQL在存储枚举时非常紧凑,MySQL将每个枚举的值保存为整数,并将“数字-字符串”映射关系保存在表“查找表”的.firm文件中”。DATATIME的存储范围更广。保存的值为1001到9999,精确到秒,与时区无关,使用8个字节的存储空间,使用可排序、无歧义的格式显示时间,以TIMESTAMP类型保存从1月1日午夜开始的秒数,1970,使用4个字节的存储空间,只能表示1970到2038,取决于时区,更节省空间,BOLB和TEXT类型推荐使用TIMESTAMP它们都是字符串,设计用来存储大量的数据,并分别以二进制和字符串格式存储。不能有太多列。最好在12个表内进行一次查询。遇到未知值时不要害怕使用NULL。在实际应用中,需要混合使用范式和反范式。使用部分规范化的模式、缓存表等技巧,对数据进行非规范化的最常见方法是复制或缓存,将相同的特定列存储在不同的表中。修改.frm文件,加快ALTERTABLE操作速度选择最适用的字段属性,尽量减少定义字段的宽度,尽量将字段设置为NOTNULL,比如'province'和'gender',最好使用ENUM而不是JOIN子查询使用联合(UNION)而不是手动创建临时表来锁定表和优化事务处理
