如果一个线程被标记为kill或query end,并且 InnoDB 引擎状态报告同一线程的回滚,请等待它结束。它可能与从磁盘中删除一些临时表有关。一个ALTER TABLE可能需要丢弃非常大的临时表,而某些文件系统(例如ext3或ext4)删除大文件可能相当慢。
一、线程长时间处于killed状态怎么办
如果一个线程被标记为kill或query end,并且 InnoDB 引擎状态报告同一线程的回滚,请等待它结束。它可能与从磁盘中删除一些临时表有关。一个ALTER TABLE可能需要丢弃非常大的临时表,而某些文件系统(例如ext3或ext4)删除大文件可能相当慢。
因此可能需要几秒钟甚至更长的时间。任何 DML 语句也可以创建临时表,但通常不会那么大。
在最极端的情况下,删除文件也不会超过十或二十秒,但在 I/O 负载较重的情况下,它可能会更长,所以有什么方法可以查看是否有临时表是否被创造?在Percona Server或MariaDB中,您检查INFORMATION_SCHEMA.GLOBAL_TEMPORARY_TABLE和INFORMATION_SCHEMA.TEMPORARY_TABLE的内容。它仅适用于使用CREATE TEMPORARY TABLE语句手动建立的临时表,不适用于 MySQL 隐式创建的执行复杂查询时的临时表。
延伸阅读:
二、行式数据库与列式数据库应用场景
行式更适合OLTP,比如传统的基于增删改查操作的应用。列式更适合OLAP,非常适合于在数据仓库领域发挥作用,比如数据分析、海量存储和商业智能;涉及不经常更新的数据。
由于设计上的不同,列式数据库在并行查询处理和压缩上更有优势。而且数据是以列为单元存储,完全不用考虑数据建模或者说建模更简单了。要查询计算哪些列上的数据,直接读取列就行。
最后我们需要务实的指出,没有使用广泛的数据库,列式数据库也并非使用广泛,只不过给DBA提供了更多的选择,DBA需根据自己的应用场景自行选择。