mysql一些好的问题

一、“N叉树”的N值在MySQL中是可以被人工调整吗?

1, 通过改变key值来调整
N叉树中非叶子节点存放的是索引信息,索引包含Key和Point指针。Point指针固定为6个字节,假如Key为10个字节,那么单个索引就是16个字节。如果B+树中页大小为16K,那么一个页就可以存储1024个索引,此时N就等于1024。我们通过改变Key的大小,就可以改变N的值
2, 改变页的大小
页越大,一页存放的索引就越多,N就越大。

 

数据页调整后,如果数据页太小层数会太深,数据页太大,加载到内存的时间和单个数据页查询时间会提高,需要达到平衡才行。

 

二、一个innoDB引擎的表,数据量非常大,根据二级索引搜索会比主键搜索快,文章阐述的原因是主键索引和数据行在一起,非常大搜索慢,我的疑惑是:通过普通索引找到主键ID后,同样要跑一边主键索引?

    覆盖索引。

 

三、

如果你要重建索引 k,你的两个 SQL 语句可以这么写:

alter table T drop index k;

alter table T add index(k);

 

如果你要重建主键索引,也可以这么写:

alter table T drop primary key;

alter table T add primary key(id);

我的问题是,对于上面这两个重建索引的作法,说出你的理解。如果有不合适的,为什么,更好的方法是什么?

 

索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,也就是索引更紧凑、更省空间。

数据空洞其实存储就浪费了。

删除数据的时候,当前删除索引被标记为被删除,改索引位置则可以被空间复用,当一页数据都被删除时页可以被复用,空间被复用但是磁盘系统表空间是未改变的,需要通过重建表,重建表的逻辑对数据紧凑排列来保存到临时文件中也就是online的逻辑对server端来说就是inplace逻辑

 

重建索引 k 的做法是合理的,可以达到省空间的目的。但是,重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。这两个语句,你可以用这个语句代替 : alter table T engine=InnoDB

 

四、

简单说一下我对你这个几种情况的理解:
1.SELECT * FROM test_like WHERE uname LIKE 'j'/ 'j%' / '%j'/ '%j%'用到uname的普通索引
A:这个应该是走到覆盖索引的缘故;
2.添加一个age字段
like后面的'%j'/ '%j%' 这两种情况用不到索引
把select * 改为 select id / select uname / select id,uname
like后面'j'/ 'j%' / '%j'/ '%j%' 这四种情况又都可以用到uname普通索引
A:如果返回值只包含(id,uname)的话,覆盖索引就能拿到所有数据,所以这种情况下like后面的多种条件都可以走到普通索引。但是如果select * 的话,返回数据由于包含了age字段,而age字段在uname的覆盖索引中查询不到需要二次回表,因此便走不到索引。
3.建立uname,age的联合索引
模糊查询还是 LIKE 'j'/ 'j%' / '%j'/ '%j%'四种情况
其中select id / select uname / select id,uname
会用到uname的普通索引
select * 会用到uname,age的组合索引
A:如果返回值只包含(id,uname)的话,覆盖索引就能拿到所有数据,所以这种情况下like后面的多种条件都可以走到普通索引。如果查询条件变为selec * 的话联合索引在这时候就是最优的覆盖索引了,所以走到了联合索引。

 

五、只要用户定义的索引字段中包含了主键中的字段,那么这个字段就不会再被InnoDB自动加到索引中了,如果用户的索引字段中没有完全包含主键字段,InnoDB就会把剩下的主键字段加到索引末尾。

 

六、innodb行级锁是通过锁索引记录实现的。如果update的列没建索引,即使只update一条记录也会锁定整张表吗?比如update t set t.name='abc' where t.name='cde'; name字段无索引

是的。但是你可以再往前考虑一下,如果是 你的update 语句后面加个limit 1, 会怎么锁?

1.可以自己实践一下,当加上limit1之后 更新语句的执行流程是先去查询再去更新,也就是查询sql为 select * from t where name = "abc" limit 1 for update,相当于扫描主键索引找到第一个满足name="abc"的条件为止,此时锁的区间为(负无穷,当前行的id],如果在这个id之后的更新和插入时都不会锁住的,在这个id之前的更新和插入会阻塞,之后则不会阻塞

2.如果不加limit 1的话,因为此时是整个主键索引全表扫描则整个表锁住了

3.你说的回表的行锁,比如字段name有普通索引,在更新操作时普通索引会锁住的同时,如果更新操作需要回表的话对应的主键索引也会存在锁(主键索引锁临界锁会退化为行锁),普通索引(间隙锁和行锁)

posted on 2020-07-13 15:47  wsw_seu  阅读(741)  评论(0编辑  收藏  举报

导航