热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL性能优化技巧分享

这篇文章主要介绍了MySQL性能优化的相关技巧,帮助大家提高数据库的性能,感

MySQL性能优化技巧分享

MySQL性能优化

在互联网公司MySQL的使用非常广泛,大家经常会有MySQL性能优化方面的需求。整理了一些在MySQL优化方面的实用技巧。

Schema与数据类型优化

  1. 整数通常是标识列最好的选择,因为它们很快并且可以使用AUTO_INCREMENT
  2. 完全“随机”的字符串(如:MD5()SHA1()或者UUID()等产生的字符串)会任意分布在很大的空间内,会导致INSERT以及一些SELECT语句变的很慢
  3. 如果希望查询执行得快速且并发性好,单个查询最好不要做太多的关联查询(互联网公司非常忌讳关联查询),利用程序来完成关联操作
  4. 如果需要对一张比较大的表做表结构变更(ALTER TABLE操作增加一列),建议先拷贝一张与原表结构一样的表,再将数据复制进去,最后通过重命名将新表的表名称修改为原表的表名称。因为在变更表结构的时候很有可能会锁住整个表,并且可能会有长时间的不可用
  5. 避免多表关联的时候可以适当考虑一些反范式的建表方案,增加一些冗余字段

InnoDB索引优化

  1. 如果不是按照索引的最左列开始查找,则无法使用索引
  2. 所有的非聚簇索引都需要先通过索引定位到对应的主键,然后在到聚簇索引查找数据,所以在定义主键索引的时候一定要谨慎
  3. 只有当索引的列顺序和ORDER BY子句的顺序完全一致,并且所有列的排序方向(倒序或者正序)都一样时,MySQL才能够使用索引来对结果做排序。有一种情况下ORDER BY子句可以不满足索引的最左前缀的要求,就是前导列为常量的时候。
  4. 在使用like来匹配字符串类型的字段的值时,尽可能的使用前缀匹配like ‘XX%",避免使用 like ‘%XX"
  5. 哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效,也不遵循索引的最左匹配原则
  6. 当服务器需要对多个索引做联合操作时(通常有多个OR条件),建议修改成UNION的方式,这样方便命中索引
  7. 对于如何选择索引的列顺序有一个经验法则:将选择性最高的列放到索引最前列
  8. 尽可能多的使用覆盖索引(如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为覆盖索引),通过EXPLAINExtra列可以看到“Using index”信息
  9. 当ID为主键时,创建索引(A),相当于创建了(A)和(A, ID)两个索引
  10. 表中的索引越多对SELECTUPDATEDELETE操作速度变慢,同时占用的内存也会比较多
  11. InnoDB在二级索引上使用共享锁,但是访问主键索引需要排他锁
  12. 尽可能的使用WHERE INWHERE BETWEEN AND的方式来进行范围查询
  13. LIMIT的偏移量越大性能越慢
  14. 编写查询语句时应该避免单行查找、尽可能的使用数据原生顺序从而避免额外的排序操作,并尽可能使用索引覆盖查询

查询性能优化

1.对于低效的查询,通常从两个方面来分析:

  1. 确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,但有时候可能是访问了太多的列
  2. 确认MySQL服务器层是否在分析大量超过需要的数据行

2.一般MySQL能够使用以下三种方式应用WHERE条件,从好到坏依次为:

  • 在索引中使用WHERE条件俩过滤不匹配的记录
  • 使用索引覆盖扫描来返回记录
  • 从数据表中返回数据,然后过滤不满足条件的记录

3.MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。在一个通用服务器上,也能够运行每秒超过10万的查询,一个千兆网卡也能轻松满足每秒超过2000次的查询,MySQL内部每秒能够扫描内存中上百万行数据

4.在删除大量数据时,建议每次删除一小批量数据后,暂停一会儿再做下一次的删除

5.无论如何排序都是一个成本很高的操作,所以从性能角度考虑,应尽可能避免排序或者尽可能避免对大量数据进行排序

6.COUNT()函数有两种不同的作用:它可以统计某个列值的数量,也可以统计行数。最简单的就是通过COUNT(*)来统计行数

7.关联查询的时候要确保关联的字段上有索引

8.在数据量很大并且历史数据需要定期删除的情况下,可以考虑使用分区表

9.如果定了的索引列和分区列不匹配,会导致查询无法进行分区过滤

10.外键约束尽可能避免,通常通过程序来实现,心中要有外键

11.触发器、存储过程、自定义函数等最好不要使用

12.尽可能的利用查询缓存,如果在写查询语句的时候有一些不确定的数据(NOW()或者CURRENT_DATE()等)时,则不会被缓存

13.用多个小表代替一个大表对查询缓存有好处

14.批量写入时只需要做一次缓存失效,所以相比单条写入(每写入一次,缓存就失效)效率更好,对于写密集型的应用,直接禁用查询缓存

15.如果缓存的空间太大,在过期操作的时候可能会导致服务器僵死

以上是个人在工作中的经验总结,如果有描述错误的地方希望大家可以帮忙指出,一起交流学习!

到此这篇关于MySQL性能优化技巧分享的文章就介绍到这了,更多相关MySQL性能优化内容请搜索编程笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程笔记!

原文链接:https://www.cnblogs.com/pinxiong/p/13407904.html


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
author-avatar
葛孝杰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有