innodb表-官网学习

官网翻译:INNDODB最佳实践

  1. InnoDB不仅允许对同一个表并发读和写访问,它还缓存修改后的数据以简化磁盘I/O。性能优势不仅限于具有长时间运行的查询的巨型表。当从一个表中一次又一次地访问相同的行时,一种称为自适应哈希索引的特性会接管,从而使这些查找更加快速,就好像它们是从哈希表中出来的一样。
  2. innodb默认会根据主键创建主键索引,如果没有创建主键索引则会根据自增的行值建立索引;
  3. 在使用join进行多表关联查询时,注意在连接列上使用外键;
  4. 当你不想频繁提交,即在insert和update和delete等频繁操作几小时时,你可以使用start transations和commit 批量操作;
  5. 不会使用锁表语句lock tables,在多个会话窗口同时操作同一张表的时候,不会丢失性能,获取某一行数据的独占访问时可以使用select * for update操作;
  6. 启用innodb_file_per_table选项,或者使用常规表空间将表的数据和索引放在单独的文件中,而不是系统表空间中。默认是关闭的;
  7. 查看默认的存储引擎
    show engines,
  8. innodb是一种多版本的执行引擎,它保存着每一行的多个版本信息,从而来保证事务的准确度与并发量,底层使用的mvcc多版本控制协议配合cas从而保持数据的准确性;
  9. innodb锁机制介绍
    a. 共享锁和排他锁:
    mysql实现了两种行级锁 一种就是共享锁,另一种就是排他锁;
    如果事务T1在r行上持有一个共享的(S)锁,那么从某个不同的事务T2请求在r行上持有一个锁的处理如下:
    T2对S锁的请求可以立即被授予。因此,T1和T2都对r持有S锁。
    T2对X锁的请求不能立即被授予。
    如果事务T1在r行上持有排他(X)锁,则不能立即授予来自不同事务T2对r上任何一种类型的锁的请求。相反,事务T2必须等待事务T1释放它在行r上的锁。
    b.意向锁:
    Intention locks are table-level locks that indicate which type of lock (shared or exclusive) a transaction requires later for a row in a table.
    意向锁是一种用来表明稍后会有事务操作某一行的标记锁
    There are two types of intention locks:有两种意向锁
    意向共享锁:表示一个事务打算对表中的某一行设置共享锁;
    意向排他锁:表示一个事务打算对表中的某一行设计排它锁;
    即在获取共享锁之前,首先应获得对于该表的意向共享锁;获取排他锁之前首先应该获取对于该表的意向排他锁;
    c:记录锁
    记录锁是在索引记录上的锁,目的是锁住某一行防止其它事务的增删改行为;
    d:间隙锁
    间隙锁是对索引记录之间间隙的锁,或者对第一个索引记录之前或最后一个索引记录之后的间隙的锁。例如 SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;防止其他事务在列t.c1中插入值15,无论该列中是否已经存在这样的值,因为该范围内所有现有值之间的间隔被锁定。

猜你喜欢

转载自blog.csdn.net/qq_43079376/article/details/108674901