zoukankan      html  css  js  c++  java
  • 一次数据库夯死引发的思考

    今天开发那边过来和我说他那边数据库无法提交数据,一直卡住

    我查看了一下进程show processlist,发现有几条delete语句和insert语句,已经执行了6000多秒了,都是非常简单的语句

    在RR模式下:

    有几条语句:

    alter table tbname drop primary key;  执行了6000多秒。

    其他delete,insert操作也一直卡在哪里。

    试验:

    新建一个表:

    CREATE TABLE TEST(

    id int,

    name varchar(20)

    );

    插入几条数据。

    1、全表均无任何索引和主键。

    语句:

    DELETE FROM TEST WHERE ID = '1'

    查看其执行计划后,发现扫描了全表。

    2、name列增加索引,删除ID列:

    DELETE FROM TEST WHERE ID = '1'

    查看其执行计划后,发现扫描了全表。

    3、name列增加索引,删除name列:

    DELETE FROM TEST WHERE name = 'a'

    查看其执行计划后,发现只扫描了一行数据,也就是说走了索引。

    结论:

    在删除或者更新的列上建立索引,否则会扫描全表。

    mysql文档中查到:

    删除和建立索引会对整张表进行重建操作。

    alter table语句的算法有两种:

    1、copy,将原表复制到临时文件中,然后修改完毕后再移动回原位。

    2、in place。在原表上进行,会短暂锁定元数据。

    一般来说:索引相关操作,更改列名,设置和删除列默认值,修改定义长度,更改自增量,这些操作不会涉及到重建表。

  • 相关阅读:
    设计一种配置文件格式(草稿)
    linux shell控制语句
    CuteC 发布(2011519)
    国外兼职外包项目大全
    寻找第K大的数的方法总结
    IEEE PDF eXpress 使用
    找出一个不在文件中的整数 编程珠玑
    BM模式匹配算法实现(C语言)
    一种可做特殊用途的字符串匹配算法
    字符设备驱动程序
  • 原文地址:https://www.cnblogs.com/magmell/p/9758797.html
Copyright © 2011-2022 走看看