xuol001 发表于 2018-9-30 08:38:18

mysql锁表机制及相关优化

2、 锁表为了能有快速的锁,MySQL除了 InnoDB 和 BDB 这两种存储引擎外,所有的都是用表级锁(而非页、行、列级锁)。  对于 InnoDB 和 BDB 表,MySQL只有在指定用 LOCK TABLES 锁表时才使用表级锁。在这两种表中,建议最好不要使用 LOCK TABLES,因为 InnoDB 自动采用行级锁,BDB 用页级锁来保证事务的隔离。
  如果数据表很大,那么在大多数应用中表级锁会比行级锁好多了,不过这有一些陷阱。
  表级锁让很多线程可以同时从数据表中读取数据,但是如果另一个线程想要写数据的话,就必须要先取得排他访问。正在更新数据时,必须要等到更新完成了,其他线程才能访问这个表。
  更新操作通常认为比读取更重要,因此它的优先级更高。不过最好要先确认,数据表是否有很高的 Select 操作,而更新操作并非很‘急需’。
  表锁锁在一个线程在等待,因为磁盘空间满了,但是却需要有空余的磁盘空间,这个线程才能继续处理时就有问题了。这种情况下,所有要访问这个出问题的表的线程都会被置为等待状态,直到有剩余磁盘空间了。
  表锁在以下设想情况中就不利了:
  一个客户端提交了一个需要长时间运行的 Select 操作。
  其他客户端对同一个表提交了 Update 操作,这个客户端就要等到 Select 完成了才能开始执行。
  其他客户端也对同一个表提交了 Select 请求。由于 Update 的优先级高于 Select,所以 Select 就会先等到 Update 完成了之后才开始执行,它也在等待第一个 Select 操作。
  下列所述可以减少表锁带来的资源争夺:
  让 Select 速度尽量快,这可能需要创建一些摘要表。
  启动 mysqld 时使用参数 --low-priority-updates。这就会让更新操作的优先级低于 Select。这种情况下,在上面的假设中,第二个 Select 就会在 Insert 之前执行了,而且也无需等待第一个Select 了。
  可以执行 SET LOW_PRIORITY_UpdateS=1 命令,指定所有的更新操作都放到一个指定的链接中去完成。

页: [1]
查看完整版本: mysql锁表机制及相关优化