文章地址为什么删除了表的一半数据,表文件大小没变化?因为delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。也可以认为是一种逻辑删除,所以物理空间没有实际释放表的数据信息存在哪里?表数据信息可能较小也可能巨大无比,它可以存储在共享表空间里,也可以单独存储
文章地址总结:优化器的逻辑优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。优化器会根据扫描行数、是否使用临时表、是否排序等因素进行综合判断,评估每个索引的执行代价。扫描行数是怎么判断的?MySQL根据统计信息来估算记录数。一个索引上不同的值的个数,我们称之为“基数”(car
文章地址总结对于比较长的字符串字段可以使用前缀索引。使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。如何确定应该使用多长的前缀?在建立索引时关注的是区分度,区分度越高越好。因为区分度越高,意味着重复的键值越少。因此,我们可以通过统计索引上有多少个不同的值来判断要使用多长
文章地址当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。把内存里的数据写入磁盘的过程,术语就是 flush。InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo log(
文章地址总结:选择普通索引还是唯一索引?对于查询过程来说:a、普通索引,查到满足条件的第一个记录后,继续查找下一个记录,直到找到第一个不满足条件的记录为止b、唯一索引,由于索引唯一性,查到第一个满足条件的记录后,停止检索但是,两者的性能差距微乎其微。因为InnoDB根据数据页来读写的。对于更新过程来
文章地址总结两阶段锁:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放。建议:如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。死锁:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源
文章地址事务的启动时机begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令。
文章地址总结覆盖索引:如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回表操作,直接返回结果,减少IO磁盘读写读取正行数据。覆盖索引的目的就是”不回表“, 所以只有索引包含了where条件部分和select返回部分的所有字段,才能实现这个目的最左前缀
文章地址总结根据加锁范围:MySQL里面的锁可以分为:全局锁、表级锁、行级锁一、全局锁对整个数据库实例加锁。MySQL提供加全局读锁的方法:Flush tables with read lock (FTWRL)这个命令可以使整个库处于只读状态。使用该命令之后,数据更新语句、数据定义语句和更新类事务的
文章地址总结:索引的作用:提高数据查询效率常见索引模型:哈希表、有序数组、搜索树哈希表:键 - 值(key - value)。哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置哈希冲突的处理办法:链表哈希表适用场景:只有等值查询的场景有序数组:按