清凤

导航

 

MySQL 索引类型有:唯一索引,主键(聚集)索引,非聚集索引,全文索引。

聚集索引(Clustered index):数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。索引的叶子节点就是对应的数据,可以直接获取到对应的全部列的数据,最好还是在创建表的时候添加聚集索引,由于聚集索引的物理顺序上的特殊性,因此如果再在上面创建索引的时候会根据索引列的排序移动全部数据行上面的顺序,会非常地耗费时间以及性能。MySQL的primary key 就是聚集索引

 

 

非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。

 

 使用心得:

  1. 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。
  2. 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。

MySQL的两种存储引擎

      MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。

  InnoDB: 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,在走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

MySQL常见面试题: mysql 常见面试题 - 割肉机 - 博客园 (cnblogs.com)

(4条消息) 面试必问的 MySQL,你懂了吗?_程序员囧辉-CSDN博客

 

分区:

如果表有一个主键或者外键,partition表达式必须是主键或者外键中的一个Column

如果表有多个主键或者外键,partition表达式必须是多个主键的一个公共列

--无法创建Table,因为有2个主键,但是没有一个公共的列

CREATE TABLE t2 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
UNIQUE KEY (col1),
UNIQUE KEY (col3)
)
PARTITION BY HASH(col1 + col3)
PARTITIONS 4;

--这个是可以的,选择联合主键中的一个列或者多个列作为Partition表达式

CREATE TABLE t2 ( col1 INT NOT NULL, col2 DATE NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL,

UNIQUE KEY (col1, col3) )

PARTITION BY HASH(col1 + col3) PARTITIONS 4;

2. 只有InnoDB 和 MyiSAM支持partition. InnoDB storage engine.  InnoDB foreign keys and MySQL partitioning are not compatible. Partitioned InnoDB tables cannot have foreign key references,

nor can they have columns referenced by foreign keys. InnoDB tables which have or which are referenced by foreign keys cannot be partitioned.

分区表的锁

MySQL官网写得是在5.7之前需要锁整个表,但是之后用了partition lock pruning 优化了,尽量只锁涉及操作的paritioned table 而非整表,而且这个只对于myISAM引擎,因为InnoDB是用的行锁。

 

posted on 2020-12-12 14:30  清凤  阅读(261)  评论(0编辑  收藏  举报