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。
Mysql优化的几点总结的更多相关文章
- MySQL优化聊两句
原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...
- 0104探究MySQL优化器对索引和JOIN顺序的选择
转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...
- mysql 优化
1.存储过程造数据 CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_test_data`(`n` int) begin declare i ...
- mysql优化笔记之分页
过年闲得蛋疼,于是看看mysql优化,看了网上好多关于分页的优化方法,但是呢,我亲自试上一把的时候,没有出现他们说的现象...难道是我的机器问题么? 下面看看我的实践记录,希望看到的加入进来交流一下O ...
- MySQL优化概述
一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...
- MySQL优化实例
这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...
- Mysql优化系列(2)--通用化操作梳理
前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...
- mysql优化记录
老板反应项目的反应越来越慢,叫优化一下,顺便学习总结一下mysql优化. 不同引擎的优化,myisam读的效果好,写的效率差,使用场景 非事务型应用只读类应用空间类应用 Innodb的特性,innod ...
- mysql 优化实例之索引创建
mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...
- MySQL优化的奇技淫巧之STRAIGHT_JOIN
原文地址:http://huoding.com/2013/06/04/261 问题 通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.* ...
随机推荐
- How Google TestsSoftware - Crawl, walk, run.
One of the key ways Google achievesgood results with fewer testers than many companies is that we ra ...
- Eclipse 启动时提示“发现了以元素'd:skin'开头的无效内容,此处不应含有子元素“
今天打开 Eclipse 时遇到了这个提示,如图所示: 关闭后发现控制台也有提示: [2016-04-19 11:11:20 - Android SDK] Error when loading the ...
- 开源、免费功能全面的Chart图
简介: 每个前端都有一个Chart梦,至于真正去做的寥寥无几,无怪乎几个原因: 浏览器兼容问题 数据处理的一些算法,如自动计算坐标轴.自动排列文本等 流畅的动画 丰富的交互功能 去年一年的时间里,我一 ...
- android 股票数据通过日K获取周K的数据 算法 源码
目前的数据是从新浪接口获取的, http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sh600000&end ...
- CSS选择器的浏览器支持
CSS1 CSS2 CSS 3 :hover 在IE6中只有a元素可用. E:empty 貌似在webkit核心浏览器中有些小bug. 如果这个bug依然存在,不太确定如何测试. IE6不支持.cla ...
- 在springmvc中配置jedis:
主要学习https://github.com/thinkgem/jeesite.一下代码均参考于此并稍作修改. 1.jedis 首先,需要添加jedis: <!--jedis--> < ...
- 配置springmvc在其他类中(spring容器外)获取注入bean
学习https://github.com/thinkgem/jeesite 今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,@Resource和@Autow ...
- 11款扁平化设计的 Twitter Bootstrap 主题和模板
扁平化设计和 Bootstrap 框架是2013年网页设计领域的两大设计潮流.把这两者集合起来不是件容易的事情,使用下面这些主题和模板将节省我们的开发时间,因为我们可以修改已有的基础代码,而不是从零开 ...
- Java魔法堂:解读基于Type Erasure的泛型
一.前言 还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Java的怀抱,然后因JDK1.4少了泛型这样语法糖(还有自动装箱.拆箱),让我受尽苦头啊,不过也反映自己 ...
- StringExtensions
public static string MakeSafeSql(this string s) { string t = s; t = t.Replace("'", "' ...