正常情况下,初创公司的流量并不是很大,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。

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

  1. MySQL优化聊两句

    原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...

  2. 0104探究MySQL优化器对索引和JOIN顺序的选择

    转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...

  3. mysql 优化

    1.存储过程造数据 CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_test_data`(`n` int) begin declare i ...

  4. mysql优化笔记之分页

    过年闲得蛋疼,于是看看mysql优化,看了网上好多关于分页的优化方法,但是呢,我亲自试上一把的时候,没有出现他们说的现象...难道是我的机器问题么? 下面看看我的实践记录,希望看到的加入进来交流一下O ...

  5. MySQL优化概述

    一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...

  6. MySQL优化实例

    这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...

  7. Mysql优化系列(2)--通用化操作梳理

    前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...

  8. mysql优化记录

    老板反应项目的反应越来越慢,叫优化一下,顺便学习总结一下mysql优化. 不同引擎的优化,myisam读的效果好,写的效率差,使用场景 非事务型应用只读类应用空间类应用 Innodb的特性,innod ...

  9. mysql 优化实例之索引创建

    mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...

  10. MySQL优化的奇技淫巧之STRAIGHT_JOIN

    原文地址:http://huoding.com/2013/06/04/261 问题 通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.* ...

随机推荐

  1. gulp/grunt和browserify/webpack的区别

    Gulp应该和Grunt比较,他们的区别我就不说了,说说用处吧.Gulp / Grunt 是一种工具,能够优化前端工作流程.比如自动刷新页面.combo.压缩css.js.编译less等等.简单来说, ...

  2. Java——List集合

    package om.hanqi.test; import java.util.ArrayList; import java.util.List; public class Test01 { publ ...

  3. [转] 移动前端不得不了解的HTML5 head 头标签

    HTML的头部内容特别多,有针对SEO的头部信息,也有针对移动设备的头部信息.而且各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元 素,有很多差异性.移动端的工作已经越来越成为前端工作的重要内容 ...

  4. Linux快速入门04-扩展知识

    这部分是快速学习的最后一部分知识,其中最重要的内容就是源码的打包和软件的安装的学习,由于个人的Linux学习目的就是自己能在阿里云Ubuntu上搭建一个简单的nodejs发布环境. Linux系列文章 ...

  5. Render OpenCascade Geometry Surfaces in OpenSceneGraph

    在OpenSceneGraph中绘制OpenCascade的曲面 Render OpenCascade Geometry Surfaces in OpenSceneGraph eryar@163.co ...

  6. Geometry Curve of OpenCascade BRep

    Geometry Curve of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲线是参数表示的曲线 ,在边界表示中其数据存在于BRep_TEdge中,BR ...

  7. java.util.Scanner简单应用

    import java.util.Scanner; import java.io.*; public class FileScannerTest{ public static void main(St ...

  8. poj 3352Road Construction(无向双连通分量的分解)

    /* 题意:给定一个连通的无向图G,至少要添加几条边,才能使其变为强连通图(指的是边强联通). 思路:利用tarjan算法找出所有的双联通分量!然后根据low[]值的不同将双联通分量 进行缩点,最后图 ...

  9. Nutch源码阅读进程3---fetch

    走了一遍Inject和Generate,基本了解了nutch在执行爬取前的一些前期预热工作,包括url的过滤.规则化.分值计算以及其与mapreduce的联系紧密性等,自我感觉nutch的整个流程是很 ...

  10. android调试输出

    测试时不想直接debug总要调试输出一些字符串信息,那以下方法可选: 1.用Log.i(TAG, "onCreate");日志输出. 先要引用 import android.uti ...