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 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,但是到目前已经发布的所有稳定版本中都普遍存在,一直没有太大改善。虽然官方也在很早就承认这一问题,并且承诺尽快解决,但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题。
6.尽量少 or
当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并没有很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,造成了其性能比较低下,很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。
7.尽量用 union all 代替 union
union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。
8.尽量早过滤
这一优化策略其实最常见于索引的优化设计中(将过滤性更好的字段放得更靠前)。
在 SQL 编写中同样可以使用这一原则来优化一些 Join 的 SQL。比如我们在多个表进行分页数据查询的时候,我们最好是能够在一个表上先过滤好数据分好页,然后再用分好页的结果集与另外的表 Join,这样可以尽可能多的减少不必要的 IO 操作,大大节省 IO 操作所消耗的时间。
9.避免类型转换
这里所说的“类型转换”是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换:
A:人为在column_name 上通过转换函数进行转换
直接导致 MySQL(实际上其他数据库也会有同样的问题)无法使用索引,如果非要转换,应该在传入的参数上进行转换
B:由数据库自己进行转换
如果我们传入的数据类型和字段类型不一致,同时我们又没有做任何类型转换处理,MySQL 可能会自己对我们的数据进行类型转换操作,也可能不进行处理而交由存储引擎去处理,这样一来,就会出现索引无法使用的情况而造成执行计划问题。
以上两种情况在开发者因为某种原因经常会有,本来可以用到索引的结果类型不对没有用到索引,或是因为类型不对又有越界的情况发生造成无法使用索引的情况,结果造成很严重的事故。
10.优先优化高并发的 SQL,而不是执行频率低某些“大”SQL
对于破坏性来说,高并发的 SQL 总是会比低频率的来得大,因为高并发的 SQL 一旦出现问题,甚至不会给我们任何喘息的机会就会将系统压跨。而对于一些虽然需要消耗大量 IO 而且响应很慢的 SQL,由于频率低,即使遇到,最多就是让整个系统响应慢一点,但至少可能撑一会儿,让我们有缓冲的机会。
11.从全局出发优化,而不是片面调整
SQL 优化不能是单独针对某一个进行,而应充分考虑系统中所有的 SQL,尤其是在通过调整索引优化 SQL 的执行计划的时候,千万不能顾此失彼,因小失大。
12.尽可能对每一条运行在数据库中的SQL进行 explain
优化 SQL,需要做到心中有数,知道SQL 的执行计划才能判断是否有优化余地,才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化之后,很明显的问题 SQL 可能已经很少了,大多都需要去发掘,这时候就需要进行大量的 explain 操作收集执行计划,并判断是否需要进行优化。
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。
3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要提高效率,可以考虑全文检索。
6.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)
13.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
2、将临时文件放内存
3、将数据库放内存(变态级)
4、优化程序(最有效的)
如果不会,你可以找护卫神,他们擅长这个。
MySQL中如何优化OR条件查询mysql中or怎么优化
1.索引。优化OR条件查询的第一个方案就是使用索引,通过为查询的列建立索引来提高查询效率。索引可以加快查询速度,提高数据库性能,但是索引也会占据大量的磁盘空间和内存空间,会影响MySQL的性能,所以我们需要权衡一下索引的建立与性能的折中。2.联合查询。联合查询也是优化OR条件查询的常用方法之一。通过...
从编译到工具:几种Mysql的优化方法
一、在编译时优化mysql如果你从源代码分发安装mysql,要注意,编译过程对以后的目标程序性能有重要的影响,不同的编译方式可能得到类似的目标文件,但性能可能相差很大,因此,在编译安装mysql适应仔细根据你的应用类型选择最可能好的编译选项。这种定制的mysql可以为你的应用提供最佳性能。技巧:选用较好的编译...
25面试题教你如何优化MySQL数据库mysql优化面试题
1.什么是MySQL优化?MySQL优化是指通过构建高性能MySQL数据库服务器来改善MySQL数据库的性能和性能。2.如何优化MySQL查询?为了优化MySQL查询,可以通过以下几种方式:使用正确的索引、使用合适的查询策略、优化表结构等。3.索引是什么?索引是MySQL中用于加速查询的一种数据结构,它有助于提高查询性能。通常...
MySQL快速比较方法优化SQL语句取两者较大值mysql两者取大
MySQL:如何快速比较和优化SQL语句 在MySQL数据库中,常常需要比较数据或取两个值中的较大值。尤其在大型数据库中,对于比较和取值的操作,往往需要进行优化以提高查询效率。下面将介绍如何快速比较数据和优化SQL语句。一、快速比较方法 1.使用IF函数 IF函数是MySQL的一个条件函数,可以根据条件返回不同的...
如何优化Mysql数据库
但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。4、复合索引 比如有一条语句是这样的:select * from users where area=‘beijing‘ and age=22;如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能...
如何优化MySQL中的LIKE操作mysql中like优化
如何优化MySQL中的LIKE操作 在MySQL中使用LIKE操作符查询数据是非常常见的操作。它可以帮助我们快速地查找数据库中的特定数据,但是在大量数据的情况下,使用LIKE操作可能会降低查询性能。本文将介绍一些优化MySQL中LIKE操作的方法。1.使用索引 在MySQL中,可以使用FULLTEXT索引或B树索引来加速LIKE操作。 FULL...
MySQL连接的原理⭐️4种优化连接的手段性能提升240%
MySQL连接的优化策略对于提升查询性能至关重要。连接查询中,理解驱动表和被驱动表的概念是关键,通常驱动表较小的表驱动较大表可以减少查询开销。常见的连接类型有左连接、右连接和内连接,其中内连接由优化器自动决定驱动表。联表查询中,通过减少访问被驱动表的次数和优化查询过程,可以采取的优化手段包...
mysql中in大量数据导致查询速度慢怎么优化?
具体优化策略之一是开启IN谓词转子查询功能。IN谓词通常用于在查询条件中匹配多个值,但在处理大量数据时,其性能可能受限。通过转换为子查询,可以避免IN谓词带来的性能瓶颈,显著提升查询速度。据测试,采用该方法后,查询性能提升幅度可达18.9倍,效果显著。要实现这一优化,操作步骤包括在PolarDB MySQL环境...
25条MySQL优化原则mysql中不低于
20.使用MySQL Cluster MySQL Cluster是一个高可用性的MySQL解决方案,可以通过使用多个MySQL服务器来实现复制和故障恢复。21.使用与您的需求相符的方法 MySQL有多种优化和配置方法,应根据实际业务情况和服务器配置来选择适合您的策略。22.优化连接 对于连接,一种有效的优化方法是通过调整缓冲池的设置来缓冲...
MySQL数据库的大型查询优化mysql不能提供
高速缓存是一种可以加速查询的方法,可以将查询的结果缓存起来,从而降低查询的响应时间。我们可以在数据库开始运行之前初始化高速缓存,实现更快的查询咨询及管理。MySQL数据库的大型查询优化需要从多个方面入手,包括索引优化、查询优化器的使用、分区表的使用和优化服务器配置等。我们需要根据实际情况进行优化...
葛毓怡瑞: 1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 2、使...
西乡塘区14718035983: 优化MYSQL数据库的方法 - ?
葛毓怡瑞: 1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM2、使用连接(JOIN)来代替子查询: a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT ...
西乡塘区14718035983: Mysql数据库应从哪些方面进行优化??
葛毓怡瑞: 对mysql优化,可以从以下几方面考虑:1.表的设计合理化(符合3NF)2.添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]3.分表技术(水平分割、垂直分割)4. 读写[写: update/delete/add]分离5.存储过程 [模块化编程,可以提高速度]6.对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]7.mysql服务器硬件升级8.定时的去清除不需要的数据,定时进行碎片整理(MyISAM)
西乡塘区14718035983: mysql的优化方法 - ?
葛毓怡瑞: MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.例如,在定义邮政编码这个字段时,如果将...
西乡塘区14718035983: 如何优化mysql数据库 - ?
葛毓怡瑞: 1 适当建立索引2 对表进行水平划分3 选择适当的字段类型,特别是主键4 文件、图片等大文件用文件系统存储,不用数据库5 外键表示清楚,方便建立索引6 宁可集中批量操作,避免频繁读写7 选择合适的引擎8 sql语句优化
西乡塘区14718035983: mysql优化应该怎么做? - ?
葛毓怡瑞: 在传智播客的官网视频中有专门的讲解mysql优化,浅显易懂你可以去找一下.总结就是一下几个方面:(1)服务器性能优化 (2)数据库引擎优化,索引优化 (3)数据库读写分离,分库分表
西乡塘区14718035983: MySQL数据库基本的三个优化法则是什么? - ?
葛毓怡瑞: (1)系统服务优化,把MySQL的key_buffer、cache_buffer、query_cache等增加容量 (2)给所有经常查询的字段增加适当的索引 (3)优化SQL语句,减少Ditinct、Group、Join等等语句的操作
西乡塘区14718035983: mysql数据库怎么优化,有几方面的优化??
葛毓怡瑞: 我列举几个我熟悉的, 1,存储引擎,根据应用选择合适的引擎 2,索引 ----这个就有很多文章了,具体需要你自己去了解 3,sql语句优化,查询条件的选择之类 4,mysql自身系统配置,需要针对应用去定制 5,表的选择,临时表,或者分区表,也需要针对应用的情况去选择使用
西乡塘区14718035983: mysql优化,有那些手段??
葛毓怡瑞: 可以使表结构的优化,注意数据量大的表的分表优化. 还有就是读写分离.
西乡塘区14718035983: 面试中常问:mysql数据库做哪些优化也提高mysql性能 - ?
葛毓怡瑞: Mysql占用CPU过高的时候,该从哪些方面下手进行优化? 占用CPU过高,可以做如下考虑: 1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processlist语句,查找负荷最重的SQL语句,优化该SQL...