读一读

  1. 索引大大减少了服务器需要扫描的数据量。

  2. 索引可以帮助服务器避免排序和临时表。

  3. 索引可以将随机I/O变为顺序I/O。


哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,不同的行计算出来不同。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。Memory引擎支持哈希索引,如果多个列的哈希值相同,索引会以链表的方式存放多个记录的指针到同一个哈希条目中。哈希索引不支持范围查询,哈希索引只包含哈希值和行指针,不包含字段信息。


只修改.frm文件,不需要重构数据的,不会重新构建表

  1. 只修改默认值是直接修改.frm的,ALTER COLUMN。

  2. 有风险的技巧(备份在搞):

    一.创建一个相同的空表,进行修改。

    二.执行FLUSH TABLES WITH READ LOCK。这将会关闭所有正在使用的表,并且禁止任何表被打开。

    三.交换.frm文件。

    四.执行UNLOCK TABLES来释放第二步的读锁。

    五.删除新创建的空表。


  1. 先在一台不提供服务的机器上执行ALTER TABLE操作,然后和提供服务的主库进行切换

  2. “影子拷贝”,用要求的表结构创建一个和源表无关的新表,然后通过重命名和删除表操作交换两张表。


MYSQL执行大部分修改表结构的方法是用新的结构创建一个空表,从旧表中查询出所有数据插入新表,然后删除旧表。这样操作对于大表来讲是需要花费很长时间的。


计数器表在Web应用很常见。缓存一个用户的朋友数,下载数等。

创建一个独立的表存储技术器通常是个好主意,这样可使计数器表小且快。此时,一个计数器表,只有一行数据,表示计数,可是高并发操作时,都要锁定这行数据,所以使用个技巧,创建多行计数行,随机访问行来实现计数,最后统计全部的行的总数来得到最后的结果。


有时提升性能最好的方法是在同一张表中保存衍生的沉余数据。然而,有时也需要创建一张完全独立的汇总表或缓存表。允许少量的脏数据的情况下,这是非常好的方法。

缓存表,表示存储那些可以简单读取但是很慢的数据表。

汇总表就是保存GROUP BY后的汇总数据了。


在范式的数据库中,每个事实数据会出现并且只出现一次。相反,在反范式化的数据库中,信息是沉余的。可能会存储在多个地方。

范式化设计的表的缺点是通常需要关联,而且也可能使一些索引策略无效。优点就是更新快,表小执行快,更少使用DISTINCT和GROUP BY。

反范式化设计,可以更好的使用索引策略,就是数据会大而沉余。

通常,实际使用都是两种结合着使用的。


Mysql把BIT当作字符串类型,而不是数字类型。也就是说,检索它时,它会获取BIT存储的int值当作ASCII码,然后转换成字符。


有时候可以使用枚举列代替常用的字符串类型。枚举列可以把不重复的字符串存储成一个预定义的集合。Mysql在存储枚举时非常紧凑,会根据列表值的数量压缩到一个或两个字节中。Mysql在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的“查找表”。