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.* ...
随机推荐
- DataTable转换成json字符串
将DataTable里面的行转换成json字符串方法: #region DataTable转为json /// <summary> /// DataTable转为json /// < ...
- HTML基础笔记-02
---恢复内容开始--- 学习网站:W3School 一.HTML的认识 纯文本语言:只显示内容,不显示样式,也不能描述语义的文档,但是也不会乱码 语义:数据的含义就是语义,数据是符号,在这表示标签 ...
- SQL*Loader之CASE6
CASE6 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase6.sql set termout off rem host write sys$output &quo ...
- 转载-centos网络配置(手动设置,自动获取)的2种方法
转载地址:http://blog.51yip.com/linux/1120.html 重新启动网络配置 # service network restart 或 # /etc/init.d/networ ...
- 让你心动的 HTML5 & CSS3 效果【附源码下载】
这里集合的这组 HTML5 & CSS3 效果,有的是网站开发中常用的.实用的功能,有的是先进的 Web 技术的应用演示.不管哪一种,这些案例中的技术都值得我们去探究和学习. 超炫的 HTML ...
- 01-Vue.js入门系列
1.1. Vue简介 Vue是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 view].新的Vue版本参考了React的部分设计,当然也有自己独特的地方,比如Vue的单文件组件开发方 ...
- Android APP压力测试(一)之Monkey工具介绍
Android APP压力测试(一) 之Monkey工具介绍 前言 本文主要介绍Monkey工具.Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕.滑动. ...
- JS魔法堂:再识ASCII实体、符号实体和字符实体
一.前言 相信大家都熟悉通过字符实体 来实现多个连续空格的输入吧!本文打算对三类HTML实体及JS相关操作作进一步的整理和小结,若有纰漏请大家指正,谢谢. 二.初识HTML实 ...
- 理解SQL Server是如何执行查询的 (2/3)
查询执行的内存授予(Query Execution Memory Grant) 有些操作符需要较多的内存才能完成操作.例如,SORT.HASH.HAS聚合等.执行计划通过操作符需要处理数据量的预估值( ...
- [JS] 使用RequireJS引用UMeditor
UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 而UMeditor则是UEditor删减版. ...