mysql数据库优化

1. Mysql优化介绍

1.1 sql优化

a. sql优化分析
b. 索引优化
c. 常用sql优化
d. 常用优化技巧

1.2 优化数据库对象

a. 优化表的数据类型
b. 表拆分
c. 逆规范式(不遵循三范式)
d. 使用中间表(一般用于大数据或者统计分析时)

1.3 优化Mysql Server

a. Mysql 内在管理优化
b. log机制及优化
c. 调整Mysql并发相关参数

1.4 应用优化

a. 数据库连接池
b. 使用缓存减少压力
c. 负载均衡建立集群
d. 主主同步 中从复制(读写分离)

2 Mysql优化问题分析定位

2.1分析SQL执行频率

mysql命令行:show status "Com_select";
查看Com_select,Com_select,Com_update,Com_delete,Innodb_rows-read,Innodb_rows_inserted,Innodb_rows_updated,Innodb_deleted状态
通过查看状态检测出该服务器是以读写哪个为主,就可以从不同方面
进行优化

2.2 定位执行效率低SQL

2.2.1 慢查询日志定位 查询结束记录:

慢查询日志文件路径

og-slow-queries

超过多少秒的查询就写入日志

long_query_time

打开my.cnf配置文件,加入以下代码:

        log-slow-queries = /tmp/mysql-slow.log  //log文件路径
        long_query_time = 2 //代表语句超过两秒的就记录

保存退出,重启MySQL即可。
[root@lizhong tmp]# tail -f /tmp/mysql_slow.log
Time: 120815 23:22:11
User@Host: root[root] @ localhost []
Query_time: 9.869362 Lock_time: 0.000035 Rows_sent: 1 Rows_examined: 6261774
SET timestamp=1294388531;
select count(*) from blog;

第一行:执行时间

第二行:执行用户

第三行(重要):

Query_time SQL执行的时间,越长则越慢

Lock_time 在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间

Rows_sent 查询返回的行数

Rows_examined 查询检查的行数

2.2.2 show processlist

查看当前正在进行的线程,包括线程状态,是否锁表(status为Locked )更多状态解析

3 索引优化

3.1 索引存储分类

B-TREE索引:最常见的索引类型,大部分都支持
HASH索引:只有Memory引擎支持,使用场景简单
R-TREE索引:空间索引是MykSAM的一个特殊索引类型,主要用于地理空间数据类型
Full-text索引:全文索引,MylSAM的一个特殊索引,Innodb从5.6开始支持

3.2 索引的创建与删除

  1. 添加PRIMARY KEY(主键索引)
    mysql>alter table 'table_name' add primary key ('columm');
  2. 添加UNIQUE(唯一索引)
    mysql>alter table 'table_name' add unique('column');
  3. 添加index(普通索引)
    mysql>alter table 'table_name' add index index_name ('column');
  4. 添加FULLTEXT(全文索引)
    mysql>alter table 'table_name' add fulltext ('column');
  5. 添加多列索引
mysql>alter table 'table_name' add index index_name ('column1','column2','column3');

3.3 索引查看

  1. show index from table_name;
  2. show keys from table_name;

3.4 Mysql中使用索引的情况

  1. 匹配全值(select name,age from test where age=15)
  2. 匹配值范围查询(select name,age from test where age>15)
  3. 匹配最左前缀
  4. 仅仅对索引进行查询(字段而不用*)
  5. 匹配列前缀(select name from test where name like "d%"
    )
  6. 部分精确+部分范围(select name,age from test where age>15 and id=1)

3.5 不能使用索引的情况

  1. 以‘%’开头的like查询
  2. 数据类型出现隐式转换(int型数据却加上引号转成字符串)
  3. 复合索引查询条件不包含最左侧部分
  4. 即使使用索引但比全表扫面还慢(数据中都是已A开头,却selec>t name from test like 'A%';)
  5. 用or分割开的条件
  6. 高秒杀的时候

3.5 查询索引的使用情况

show status like 'Handler_reader%';
其中Handler_read_rnd_next越大,说明查询中大部分都没使用索引

4 常用sql语句优化

4.1 定期优化表

使用Optimize table table_name(不宜经常使用,看操作次数,一周左右就可以)来合并表空间碎片(对MYISAM,DBD,INNODB有效)
默认情况下直接对innodb引擎的数据表使用,可能会显示[Table does not support optimize,doing recreate + annalyze install]的提示信息,这时候我们需要用mysql --skip-new或者mysql --safe-mode命令来重启MySQL,以便于其他引擎支持OPTMIZE TABLE

4.2 常用优化

  1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上简历索引
  2. 应该尽量避免在where子句中使用!=,<>不等于操作符,否则将引擎放弃使用索引而进行扫面。
  3. 尽量在where语句中别使用or连接。
  4. 乱用%导致全表扫描,如果想提高效率,可以换成全文索引
  5. 应尽量避免在where字句中对字段进行表达式操作,这将导致引擎将放弃使用索引而进行全盘扫描
  6. 应尽量避免在where子句中使用对字段的函数操作,这将导致引擎放弃索引。

5. 优化数据库对象

5.1 优化数据类型

使用 PROCEDURE ANALYSE()对当前应用的表进行分析,它会给出优化建议,用户可根据实际情况考虑是否优化,输入如下命令之后,看最后一列,不一定正确,可参考。
PROCEDURE ANALYSE(16,256)排出多余16个,大于256字节的ENUM建议。
例:select * from user procedure analyse();

5.2 表拆分

  1. 垂直拆分:字段比较多,而针对某些不常用字段
  2. 水平拆分:a。表很大;b。表中的数据本来就有独立性,能简单分类;c.需要把表存放在多中介质

5.3 逆规范式

逆规范式可以降低链接操作,加快查询速度,但会降低修改速度,影响数据完整性。所以在考虑使用逆规范式时一定要权衡利弊
常用的逆规范式有:增加冗余列,增加派生列,重新组表和分割表、

5.4 使用中间表

  1. 数据查询量大
  2. 数据统计,数据分析
    像查找财务报表,需要很多join,这时只需要建一两个中间表,先整合,在用一到两个join完成

6. Mysql引擎比较

6.1 存储引擎

10.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容