首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Oracle频道
中国IT教育
Google
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 下载 专题 讨论
您现在的位置: 中国IT实验室 >> Oracle >> 性能调优 >> 正文

MySQL数据库优化(八)

      表级锁和行级锁或页级锁之间的不同之处还在于:

      将同时有一个写和多个读的地方做版本(例如在MySQL中的并发插入)。也就是说,数据库/表支持根据开始访问数据时间点的不同支持各种不同的试图。其它名有:时间行程,写复制,或者是按需复制。

      按需复制在很多情况下比页级锁或行级锁好多了。尽管如此,最坏情况时还是比其它正常锁使用了更多的内存。

      可以用应用程序级锁来代替行级锁,例如MySQL中的 GET_LOCK() 和 RELEASE_LOCK()。但它们是劝告锁(原文:These are advisory locks),因此只能用于安全可信的应用程序中。

      2  锁表

      为了能有快速的锁,MySQL除了 InnoDB 和 BDB 这两种存储引擎外,所有的都是用表级锁(而非页、行、列级锁)。

      对于 InnoDB 和 BDB 表,MySQL只有在指定用 LOCK TABLES 锁表时才使用表级锁。在这两种表中,建议最好不要使用 LOCK TABLES,因为 InnoDB 自动采用行级锁,BDB 用页级锁来保证事务的隔离。

      如果数据表很大,那么在大多数应用中表级锁会比行级锁好多了,不过这有一些陷阱。

      表级锁让很多线程可以同时从数据表中读取数据,但是如果另一个线程想要写数据的话,就必须要先取得排他访问。正在更新数据时,必须要等到更新完成了,其他线程才能访问这个表。

      更新操作通常认为比读取更重要,因此它的优先级更高。不过最好要先确认,数据表是否有很高的 SELECT 操作,而更新操作并非很‘急需’。

      表锁锁在一个线程在等待,因为磁盘空间满了,但是却需要有空余的磁盘空间,这个线程才能继续处理时就有问题了。这种情况下,所有要访问这个出问题的表的线程都会被置为等待状态,直到有剩余磁盘空间了。

      表锁在以下设想情况中就不利了:

      一个客户端提交了一个需要长时间运行的 SELECT 操作。

      其他客户端对同一个表提交了 UPDATE 操作,这个客户端就要等到 SELECT 完成了才能开始执行。

      其他客户端也对同一个表提交了 SELECT 请求。由于 UPDATE 的优先级高于 SELECT,所以 SELECT 就会先等到 UPDATE 完成了之后才开始执行,它也在等待第一个 SELECT 操作。

    上一页  [1] [2] [3] [4] 下一页

    【责编:michael】

    中国IT教育

    相关产品和培训
    文章评论
     友情推荐链接
     认证培训
     专题推荐

     ·关于Java框架技术专题
     ·XML全攻略技术专题
     ·JAVA开源技术介绍专题
     ·Java嵌入式开发之J2ME技术专题
     ·超前体验 Oracle 11g的5个新特性…
     ·揭密使用VB.NET的五个实用技巧
     ·Oracle和SQL Server常用函数对比专题…
     ·展现C#世界 C#程序设计专题…
     ·Java入门 Tomcat的配置技巧精华专题…
     ·Oracle RMAN物理备份技术详解…
     今日更新
     社区讨论
     博客论点
     频道精选
     Oracle频道相关导航