Mysql优化的几点总结

正常情况下,初创公司的流量并不是很大,mysql数据库在未做优化的情况依然可以满足性能要求,特别是5.6版本后mysql在性能上还是有了很大提升,所以在初期并没有花精力在此上面。但后来发生的一系列问题还是说明mysql性能优化在项目启动时就应该重视起来。下面就出现问题的原因和需要注意的地方说明如下:

问题来源

开发人员之前多数使用oracle,由于oracle强大的性能和所做项目多是内部企业应用,不太可能出现性能问题。在这样的背景下,开发人员依然按照原来的方式来写代码,导致后来性能问题,总结有以下几点:

1.sql多表联合查询,常常是3,4张表联合查询

2.sql中使用大量函数

3.sql中直接select *

4.表字段缺少索引或者索引方式不对

5.表设计考虑不周,出现大量空字段

6.表主键设计成UUID,由于使用传统机械硬盘,对寻址非常不利

7.过多使用触发器

8.sql中存在复杂计算

解决方案

首先通过慢日志过滤出大于1s的sql语句,解决mysql性能问题,一定要利用好慢日志。然后通过执行计划(explain)来查看sql的执行情况。具体优化措施如下:

联合查询分拆成单表查询

如果此sql是联合查询,首先确认是否是可以拆分成单表查询,然后通过程序来进行处理数据。最多不能超过两表联合查询。

建立合适索引

通过执行计划,对全表扫描的查询一定要建立索引,在建立索引时,一定要考虑到此字段是否有大量空字段,字段值是否大量重复,可区分度是否高,不然建立索引的意义不大,反而是影响insert 和 delete操作。对于长字符类型的字段,增加算因时,需要增加前缀,计算方式为:select count(distinct left(b,5)) /count(distinct b) as left5,count(distinct left(b,6))/count(distinct b) as left6 from test_unique
limit 1,其中5,6是预估值,对于UUID这样长字符类型,一般前缀是6.增加索引时sql语句为:alter table test.test_unique add key (left(6));。 对于不能重复的字段,建议使用唯一索引,一是保证插入值唯一,二是提高查询速度 。 在where、order 、group by后面的字段,尽量建立索引,通过需要注意的是如果where后面是多字段,那么需要建立联合索引,而不是单个建立索引,并且需要注意联合索引的顺序,例如where a=‘x‘ and b = ‘y‘,在其它sql中出现where
b=‘z’这样的情况,那么联合索引顺序为(b,a),而不是单独建立(a,b)和(b)两个索引,因为在建立联合索引(b,a)时,mysql会建立两个索引(b),(b,a)两个索引。

避免索引失效

在字段上使用函数将会使索引失效,因此一定要避免在左侧字段使用函数,而是提前在程序里处理好。

尽量避免函数

mysql提供了大量的函数,但对于这些函数,尽量不要用,而是在程序里进行处理,目前mysql对于这些函数优化工作做的并不是很好,往往有时候会导致严重的性能问题。

表主键使用自增序列

表主键尽量采用自增序列,这样可以充分mysql的存储特性,mysql采用B+树存储。需要注意的地方在于:如果是分库分表,那么需要不能直接使用自增序列,需要采用其他方法来完成,常用的方式通过redis来维护一套ID。

时间: 2024-11-08 07:58:25

Mysql优化的几点总结的相关文章

Mysql优化(转)

Mysql优化主要通过执行计划,索引,sql语句,调整mysql内部配置 (http://blog.chinaunix.net/uid-11640640-id-3426908.html) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)  

MySQL优化—工欲善其事,必先利其器之EXPLAIN

转自:http://www.cnblogs.com/magialmoon/archive/2013/11/23/3439042.html mysql官方手册关于explain命名的说明文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_select_type 最近慢慢接触MySQL,了解如何优化它也迫在眉睫了,话说工欲善其事,必先利其器.最近我就打算了解下几个优化MySQL中经常用到的工具.今天就简单介绍下

MySQL优化概述

MySQL优化概述 设计: 存储引擎,字段类型,范式 功能: 索引,缓存,分区. 架构: 主从复制,读写分离,负载均衡. 合理SQL: 测试,经验. 存储引擎 Create table tableName () engine=myisam|innodb; 一种用来存储MySQL中对象(记录和索引)的一种特定的结构(文件结构) 存储引擎,处于MySQL服务器的最底层,直接存储数据.导致上层的操作,依赖于存储引擎的选择. Tip:存储引擎就是特定的数据存储格式(方案) Show engines 查看

小菜鸟mysql优化解决方案

根据小菜鸟的个人习惯,自己的编写的一套MYSQL优化方案,感觉还是有点儿菜,望大家谅解,不足之处,请大神们互动! #mysql优化解决方案 #公共参数默认值: max_connections = 151 #同事处理多大连接数,推荐设置最大连接数是上限连接数的80%左右 sort_buffer_size = 2M #查询排序时缓冲区大小,只对order by和group by起作用,可增大此值为16M open_files_limit = 1024 #打开文件数限制,如果show global s

centos mysql 优化 第二十三节课

centos mysql  优化  第二十三节课 f

centos mysql 优化 第二十一节课

centos mysql  优化  第二十一节课 f

centos mysql 优化 第十九节课

centos mysql  优化  第十九节课 f

centos mysql 优化 第十八节课

centos mysql  优化  第十八节课 f

centos mysql 优化 第十二节课

centos mysql  优化  第十二节课 f

网站优化—MySQL优化

MySQL优化 简介 由于页面静态化技术可以实现对动态数据的缓存,但是有的时候还是需要去请求数据库.所以对数据库的优化也是不可缺少的. 优化思路 设计:存储引擎,字段,范式 自身:索引,自身的缓存 架构:读写分离 ? 存储引擎: MyISAM和InnoDB之间的对比.当然需要知道MySQL除了这两种存储引擎还有其他的存储引擎(memory存储引擎). MySQL在5.5版本之后默认的存储引擎为InnoDB 在面试的过程中,只要说出MyISAM和InnoDB的区别即可 ? 字段选择: 合适即好,能