优化数据库对象

1.优化表的数据类型

  select * from tbl1 procedure analyse(16,256) ,会输出优化建议,结合情况优化

2.拆分表(仅Myisam)

 2.1 纵向拆分

  按照访问频率,将经常访问的字段和不常访问的字段拆分开来,经常访问的尽量定长

2.2 横向拆分

  根据应用情况,将数据分为几个表,或者分到不同区中,可以避免读取与更新导致的锁问题

3  逆规范化

 冗余越少 带来的联查越多,会降低效率

 其实就是空间与时间的平衡

4. 使用冗余统计表

  create temporary table 建的是session表,数据保存在内存,

  统计的时候效率高

5.更改合适表类型

 锁冲突严重,考虑使用innodb

 查询多,对事务完整性不严格,考虑使用Myisam

锁问题
 
 show status like ‘Table%’

  查看表锁定争夺情况

  show status like ‘innodb_row_lock%’

  查看行锁争夺情况

行锁的优点:

1.多线程访问不同行

2.回滚只有少量的更改

3.可以长时间锁定单一的行

行锁的缺点:

1.比页级或者表级锁占用更多的时间

2.当操作表中的大部分数据时,需要获取更多的锁,速度慢

3.粒度太细

insert ...select ...问题

若select的表是innodb,那么会一直锁定相关行,主要是为了保证主从一致

推荐使用 select ..into outfile  和 load data infile组合来实现

next-key锁问题(下面所有的待研究)

  防止'幽灵问题",会额外锁定不存在的东西

 隔离级别对并发插入的影响
  REPEATABLE READ 是 InnoDB 的默认隔离级别。
  带唯一搜索条件使用唯一索引的 SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE 和 DELETE 语 句只锁定找到的索引记录, 而 不锁定记录前的间隙。 用 其它搜索条件, 这 些操作采用 next-key 锁定,用 next-key 锁定或者间隙锁定锁住搜索的索引范围,并且阻止其它 用户的新插入。在持续读中,有一个与 READ COMMITTED 隔离级别重要的差别:在这个级别,在 同一事务内所有持续读读取由第一次读所确定的同一快照。 这个惯例意味着如果你在 同一事务内发出数个无格式 SELECT 语句,这些 SELECT 语句对相互之间也是持续的。READ COMMITTED 隔离级别是一个有些象 Oracle 的隔离级别。所有 SELECT ... FOR UPDATE 和 SELECT ... LOCK IN SHARE MOD 语句仅锁定索引记录,而不锁定记录 前的间隙,因而允许随意紧挨着已锁定的记录插入新记录。UPDATE 和 DELETE 语句使 用一个带唯一搜索条件的唯一的索引仅锁定找到的索引记录,而不包括记录前的间 隙。
在范围类型 UPDATE 和 DELETE 语句, InnoDB 必须对范围覆盖的间隙设置 next-key 锁定或间隙锁定以及其它用户做的块插入。 这 是很必要的, 因 为要让MySQL 复制和恢复起作用, “幽灵行”必须被阻止掉。如果应用是从基于 ORACLE 的应用迁移到 MYSQL 数据库的,那么建议使用该隔离级别提供数据库服务,因为该隔离级别是最接近 ORACLE 的默认隔离级别的,迁移可 能遇到的锁问题最小。
 
如何减少锁冲突
1.对 Myisam 类型的表
1)可以考虑通过改成 Innodb 类型的表来减少锁冲突。
2) 根据应用的情况,尝试横向拆分成多个表或者改成 Myisam 分区对减少锁冲突也会
索引访问,那么即便你只是要更新其中的一行纪录,也是全表锁定的。要确保sql 是使用索引来访问纪录的,必要的时候,请使用explain 检查 sql 的执行计划,判 断是否按照预期使用了索引。
2) 由于 mysql 的行锁是针对索引加的锁, 不 是针对纪录加的锁, 所 以虽然是访问不同 行的纪录,但是如果是相同的索引键,是会被加锁的。应用设计的时候也要注意, 这里和 Oracle 有比较大的不同。
3) 当表有多个索引的时候, 不 同的事务可以使用不同的索引锁定不同的行, 当 表有主 键或者唯一索引的时候, 不 是必须使用主键或者唯一索引锁定纪录, 其 他普通索引 同样可以用来检索纪录,并只锁定符合条件的行。
4) 用 SHOW INNODB STATUS 来确定最后一个死锁的原因。查询的结果中,包括死锁的 事务的详细信息,包括执行的SQL 语句的内容,每个线程已经获得了什么锁,在等 待什么锁, 以 及最后是哪个线程被回滚。 详 细的分析死锁产生的原因, 可 以通过改 进程序有效的避免死锁的产生。
5) 如果应用并不介意死锁的出现,那么可以在应用中对发现的死锁进行处理。
6) 确定更合理的事务大小,小事务更少地倾向于冲突。
7) 如果你正使用锁定读, (SELECT ... FOR UPDATE 或 ... LOCK IN SHARE MODE),
试着用更低的隔离级别,比如 READ COMMITTED。
1) 首先要确认, 在 对表获取行锁的时候, 要 尽量的使用索引检索纪录, 如 果没有使用
8) 以固定的顺序访问你的表和行。则事务形成良好定义的查询并且没有死锁 

MYSQL性能优化(3)的更多相关文章

  1. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  2. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  3. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

  4. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  5. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  6. mysql 性能优化方向

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  8. MYSQL性能优化的最佳20+条经验

    MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论  131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...

  9. [MySQL性能优化系列]LIMIT语句优化

    1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...

  10. mysql 性能优化方案

    网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

随机推荐

  1. 非常好的开源C项目tinyhttpd(500行代码)

    编译命令 gcc -W -Wall -lpthread -o httpd httpd.c 源码 #include <stdio.h> #include <sys/socket.h&g ...

  2. Linuxs升级系统自带的openssh

      最近有空复习了一下Linux,在虚拟机上安装了个CentOS6.5,顺便升级一下系统自带的openssh,任何系统操作都有风险,正式环境请做好备份工作.废话少说,直接贴代码.     1.准备工作 ...

  3. python------面向对象进阶 异常处理

    一. 异常处理 try: pass except KeyError as e : #注3.x用as ,except KeyError, e ,2.x 用逗号. print("No this ...

  4. python 的 format 函数

    python的格式化字符串方法之一------------format 函数 它通过{}和:来代替%. 数字 格式 输出 描述 3.1415926 {:.2f} 3.14 保留小数点后两位 3.141 ...

  5. c#利用ApplicationContext类 同时启动双窗体的实现

    Application类(位于System.Windows.Forms命名空间)公开了Run方法,可以调用该方法来调度应用程序进入消息循环.Run方法有三个重载 1.第一个重载版本不带任何参数,比较少 ...

  6. PHP如何判断一个数组是一维还是多维

    什么叫多维数组呢?多维数组,本质上是以数组作为数组元素的数组. 二维数组又称为矩阵,一个数组的元素如果是一维数组,那么我们就称这个数组是二维数组. 怎么判断一个数组是否是一维数组呢?通过count() ...

  7. Linux 释放cache化缓存

    Linux 释放cache化缓存 free -g查看空余内存以及已使用内存 原文  https://blog.csdn.net/tomspcc/article/details/78131468 机械硬 ...

  8. LeetCode——727.Minimum Window Subsequence

    一.题目链接:https://leetcode.com/problems/minimum-window-substring/ 二.题目大意: 给定两个字符串S和T,要求从S中找出包含T中所有字母的最短 ...

  9. 洛谷P1605走迷宫

    传送 这是一道dfs,但是...但是....但是它竟然被放在bfs练习题辣!!!! 打了半天bfs,发现路径不会标记了,于是发现好像有什么不对的,似乎dfs要简单一点,于是半路跑去打dfs,结果打了半 ...

  10. docker stats监控容器资源消耗

    在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸运的是 docker 自己就提供了这样的命令:docker stats. 默认输出 docker sta ...