mysql

一、为什么表数据删掉一半,表文件大小不变

1、参数 innodb_file_per_table 设置数据存放位置:单独文件里还是共享表空间里;

2、数据删除流程:

        delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。也就是说,通过 delete 命令是不能回收表空间的,可以复用但是没有被使用的空间好像‘空洞’;

    不止是删除数据会造成空洞,插入数据也会;

更新索引上的值,可以理解为删除一个旧的值,再插入一个新值。不难理解,这也是会造成空洞的。

3、重建表

 

 

 

 

    你可以使用 alter table A engine=Innodb;

    在重建表的过程中,在原表上不能有数据插入,5.6后online 可以 ,引入row_log;

4、 online 和 inplace

二、count(*)为什么这么慢

1、为什么使用 innodb ,并发、数据安全、事务;

2、show table status  TABLE_ROWS 采样获取 误差较大(30% - 40%);

3、用缓存系统保存计数;

4、用mysql 保存计数;

5、count(*) >= count(1) > count(id) > count(field)

三、 order by 工作原理

1、全字段排序

    1)using fileSort 表明是排序;

    2)mysql 为每个线程分配一块内存用来排序: sort_buffer(sort_buffer_size 设置大小);

    3)  排序的流程 

           ① 初始化 sort_buffer ,放入 要查询的字段

           ② 找到符合要求的记录的主键id;

           ③ 按主键id取出整行,放入到 sort_buffer

           ④ 重复 ②、③ 步骤;

           ⑤ 根据指定字段排序;

           ⑥ 返回结果;

6c821828cddf46670f9d56e126e3e772.jpg

4、sort_buffer_size (临时文件的数量)决定是内存排序还是外部排序

    

            /* 打开 optimizer_trace,只对本线程有效 */
            SET optimizer_trace='enabled=on'; 

            /* @a 保存 Innodb_rows_read 的初始值 */
            select VARIABLE_VALUE into @a from  performance_schema.session_status where variable_name = 'Innodb_rows_read';

            /* 执行语句 */
            select city, name,age from t where city='杭州' order by name limit 1000; 

            /* 查看 OPTIMIZER_TRACE 输出 */
            SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G

            /* @b 保存 Innodb_rows_read 的当前值 */
            select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name = 'Innodb_rows_read';

            /* 计算 Innodb_rows_read 差值 */
            select @b-@a;

 

 

2、rowId 排序

    1)设置每行数据阈值(max_length_for_sort_data);

    2)流程图

dc92b67721171206a302eb679c83e86d.jpg

3)执行数量

 

        

3、全字段排序 VS rowid 排序

        1、默认如果内存够用,优先使用内存;

        2、数据有序

           (1) (主键id、排序字段) 回表;

1a45ea0a9d071f485fd6e1b383223b08704.jpg

          (2)覆盖索引 不用回表

acbd74a832393b195c8c0ceba85a6101da9.jpg

 

        

 

转载于:https://my.oschina.net/u/4032854/blog/3030373

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值