![]() |
1
5
在几乎所有情况下,MySQL都将在alter**期间重建表。这是因为基于行的引擎(即所有引擎)必须这样做,才能以正确的格式保留数据以供查询。这也是因为您可以进行许多其他更改,这些更改还需要重新构建表(例如更改索引、主键等)。 我不知道你用的是什么引擎,但我假设是Myisam。myisam复制数据文件,进行任何必要的格式更改-这相对比较快,而且不会比IO硬件将旧数据文件放入磁盘和将新数据文件移出磁盘所花费的时间长太多。 重建索引确实是个杀手。根据配置的不同,MySQL会:对于每个索引,将索引列放入文件排序缓冲区(可能在内存中,但通常在光盘上),使用其filesort()函数对其进行排序(如果文件太大,则通过在两个文件之间递归复制数据来执行快速排序),然后构建整个索引。基于排序的数据。 如果它不能实现文件排序技巧,那么它的行为就好像您在每一行上都进行了一次插入,然后依次用每一行的数据填充索引块。这是一个痛苦的缓慢过程,结果与最佳指标相差甚远。 您可以在处理过程中使用show processlist来判断它在做什么。”按文件排序修复“很好”,用keycache修复“很差。 所有这些都将最多使用一个核心,但有时也会绑定IO(尤其是复制数据文件)。 **有一些例外,例如删除InnoDB插件表上的辅助索引。 |
![]() |
2
1
添加一个
|
![]() |
3
0
这将接触到20万条记录中的每一条,因为每个记录都需要用一个新的bool值进行更新,该值不会为空。 所以,是的,这是一个昂贵的问题…你不能做任何事来加快速度。 |
![]() |
hello_programmers · Mysql从其他表输出一列 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |
![]() |
Popo · Sql查询:返回数据库中不可用的where条件 1 年前 |
|
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 1 年前 |
|
Kugelfisch · 用php为数据库加密数据 1 年前 |