优化数据库对象

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. nginx 504 Gateway Time-out

    #设定http服务器 http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 ...

  2. APP打包提交审核的步骤

  3. Cortex-M3 跳转到指定bin执行

    跳转前指定sp和msp: #if defined(__GNUC__) __attribute__(( naked )) static void set_sp(unsigned long addr) { ...

  4. Cache架构设计

    Cache策略 定时过期策略 定时过期的好处是Cache节点的个数符合实际需求,不会造成资源滥用和服务器压力 定时过期适合访问量较大,实时性要求不高的情况 如果访问量小,定时过期会造成Cache命中率 ...

  5. solrJ

    导入jar包 package com.tzy.solrJ; import java.io.IOException; import org.apache.solr.client.solrj.SolrSe ...

  6. centos7.4 64位安装 google-chrome 与 chromedriver 运行 Python selenium 项目

    centos7.4 实例 利用 yum 命令安装 google-chrome 超级简单(安装最新版): yum install https://dl.google.com/linux/direct/g ...

  7. Flask--templates-多个模板文件,视图函数如何判断查询路径

    结论:以当前视图的模板为基准,查找模板文件,如果没有找到就会报错,如果需要更换模板的访问路径,可以修改__name__参数. 参考资料: https://blog.csdn.net/f70408410 ...

  8. [转][C#]压缩解压

    { internal static class Compressor { public static Stream Decompress(Stream source, bool bidiStream) ...

  9. note 4 三大结构

    程序流程图 顺序结构 选择结构 if if-else if 语句-嵌套结构(Nested) 多分支结构(Chained) if score >= 90: print 'ARM' elif sco ...

  10. 基于CentOS搭建个人Leanote云笔记本

    Leanote 依赖 MongoDB 作为数据存储,下面开始安装MongoDB: 1. 下载启动 MongoDB 下载 MongoDB 进入 /home 目录,并下载 MongoDB: cd /hom ...