mysql优化(mysql优化查询)
本篇文章给大家谈谈mysql优化,以及mysql优化查询对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
超详细MySQL数据库优化
数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷.
1. 优化一览图
2. 优化
笔者将优化分为了两大类,软优化和硬优化,软优化一般是操作数据库即可,而硬优化则是操作服务器硬件及参数设置.
2.1 软优化
2.1.1 查询语句优化
1.首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息.
2.例:
显示:
其中会显示索引和查询数据读取数据条数等信息.
2.1.2 优化子查询
在MySQL中,尽量使用JOIN来代替子查询.因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高.
2.1.3 使用索掘竖引
索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者返薯MySQL数据库索引一文,介绍比较详细,此处记录使用索引的三大注意事项:
2.1.4 分解表
对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,
2.1.5 中间表
对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时.
2.1.6 增加冗余字段
类似于创建中间表,增加冗余也是为了减少连接查询.
2.1.7 分析表,,检查表,优化表
分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的漏散者表空间浪费.
1. 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;
2. 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]
option 只对MyISAM有效,共五个参数值:
3. 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;
LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志.,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁.
2.2 硬优化
2.2.1 硬件三件套
1.配置多核心和频率高的cpu,多核心可以执行多个线程.
2.配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度.
3.配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行操作的能力.
2.2.2 优化数据库参数
优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能.MySQL服务的配置参数都在my.cnf或my.ini,下面列出性能影响较大的几个参数.
2.2.3 分库分表
因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。
2.2.4 缓存集群
如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。
一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计.因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了.
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数据库优化都包括哪些项目?
此文章主要向大家介绍的是MySQL数据库优化 其中还包括MySQL数据库的性能优化 常用的SQL语句的优化以及MySQL数据库对INSERT语句进行优化的实际操作方案的描述 望你会有所收获
MySQL InnoDB 的性能问题讨论
MySQL性能优化
InnoDB delete from xxx速度暴慢原因
推荐圈子: mysql研究
更多相关推荐 定期分析表和检查表
分析表的语法如下
引用
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb _name[ tbl_name]
以上语句用于分析和存储表的关键字分布 分析的结果将可以使得系统得到准确的统计信息 使得SQL能够生成正确的执行计划 如果用户感觉实际执行计划并不是预期的执行计划 执行一次分析表可能会解决问题 在分析期间 使用一个读取锁定对表进行锁定 这对于MyISAM DBD和InnoDB表有作用
例如分析一个数据表
引用
*** yze table table_name
检查表的语法如下
引用
CHECK TABLE tb _name[ tbl_name] [option] option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
检查表的作用是检查一个或多个表是否有错误 CHECK TABLE 对MyISAM 和 InnoDB表有作用 对于MyISAM表 关键字统计数据被更新
CHECK TABLE 也可以检查视图是否有错误 比如在视图定义中被引用的表不存在
定期优化表
MySQL数据库优化表的语法如下
引用
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb _name [ tbl_name]
如果删除了表的一大部分 或者如果已经对含有可变长度行的表(含有 VARCHAR BLOB或TEXT列的败宏表)进行更多更银枯亩改 则应使用OPTIMIZE TABLE命令来进行表优化 这个命令可以将表中的空间碎片进行合并 并且可以消除由于删除或者更新造成的空间浪费 但OPTIMIZE TABLE 命令只对MyISAM BDB 和InnoDB表起作用
例如 optimize table table_name
锋森 注意 *** yze check optimize执行期间将对表进行锁定 因此一定注意要在数据库不繁忙的时候执行相关的操作
常用的SQL优化
我们在开发的时候常常用到的SQL语句 无非是INSERT GROUPBY等等 对于这些SQL语句 我们怎么进行优化?
大批量插入数据
当用load命令导入数据的时候 适当的设置可以提高导入的速度
对于MyISAM存储引擎的表 可以通过如下方式快速的导入大量的数据
引用
ALTER TABLE tb _name DISABLE KEYS;
loading the data
ALTER TABLE tb _name ENABLE KEYS;
DISABLE KEYS 和 ENABLE KEYS 用来打开或者关闭MyISAM表非唯一索引的更新 在导入大量的数据到一个非空的MyISAM表时 通过设置这两个命令 可以提高导入的效率
对于导入大量的数据到一个空的MyISAM表时 默认就是先导入数据然后才创建索引的 索引不用进行设置
引用
load data infile /home/mysql/text_txt into table text
对于InnoDB类型的表 这种方式不能提高导入数据的效率 但也有几种针对InnoDB类型的表进行MySQL数据库优化的方式
因为InnoDB类型的表式按照主键的顺序保存的 所以将导入的数据按照主键的顺序排序 可以有效提高导入数据的效率
在导入数据前执行 SET UNIQUE_CHECKS= 关闭唯一性校验 在导入结束后执行SET UNIQUE_CHECKS= 恢复唯一性校验 可以提高导入的效率
如果应用使用自动提交的方式 建议在导入前执行SET AUTOMIT= 关闭自动提交 导入结束后执行SET AUTOMIT= 打开自动提交 也可以提高导入效率
MySQL数据库优化INSERT语句
当进行数据INSERT的时候 可以考虑采用以下几种方式进行优化
如果同时从一个客户插入很多行 尽量使用多个值表的INSERT语句 这种方式将大大缩短客户端与数据库的链接 关闭等消耗 使得效率比分开执行的单个INSERT语句快
例如
insert into test values( )
insert into test values( )
insert into test values( )
将上面三句改为:insert into test values( ) ( ) ( )
如果从不同客户插入很多行 能通过使用INSERT DELAYED 语句得到更高的速度
DELAYED 的含义是让INSERT 语句马上执行 其实数据都被放在内存的队列中 并没有真正写入磁盘 这比每条语句分别插入要快得多 LOW_PRIORITY刚好相反 在所有其他用户对表的读写完后才进行插入
将索引文件和数据文件分在不同的磁盘上存放
如果进行批量插入 可以增加bulk_insert_buffer_size变量值的方法来提高速度 但是 这只能对于MyISAM表使用
当从一个文本文件中装载一个表时 使用LOAD DATA INFILE 这通常比使用很多insert语句快 倍左右
lishixinzhi/Article/program/MySQL/201311/29324
[img]关于mysql优化和mysql优化查询的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。