最近大后台查看一些数据统计的时候,很慢,甚至会有超时情况,前端设置的超时时间是20秒。
后来通过查看日志和慢查询,发现一条sql语句执行时间超过18秒,基本都19秒左右。

大表加索引

select (*) from tb_name where create_time > xxx;
最终得知是因为这个表数据行数已经超过 一千万了,然后create_time字段又没有索引 。

那解决办法肯定是加索引喽。

但是这个表是一直在线上运行,很重要和业务部分。如果给千万级的大表在线加索引 ,肯定会卡死。

然后就搜罗了一大筐解决方案,比如 在线无锁加索引使用

ALTER TABLE tbl_name ADD PRIMARY (column), ALGORITHM=INPLACE, LOCK=NONE;
后来才发现,这个特性是Mysql 5.6以后才支持,然而我们的mysql用的是5.5版本

最后在 《高性能Mysql》一书中看到,可在通过 “影子拷贝”来解决-弊端没有考虑新增加和update 数据,

就是 先创建一张和源表无关的新表,然后通过重命名和删表操作交换两张表;

#操作步骤:
#1、创建一张和原表结构一样的空表,只是表名不一样create table tb_name_tmp like tb_name;#2、把新建的空表非主键索引都删掉,因为这样在往新表导数据的时候效率会很快(因为除了必要的主键以外,不用再去建立其它索引数据了)alter tb_name_tmp drop index index_name;#3、从旧表往主表里导数据,如果数据太大,建议分批导入,只需确保无重复数据就行,因为导入数据太大,会很占用资源(内存,磁盘io, cpu等),可能会影响旧表在线上的业务。我是每批次100万条数据导入,基本上每次都是在 20s左右insert into tb_name_tmp select * from tb_name where id between start_id and end_id;#4、数据导完后,再对新表进行添加索引create index index_name on tb_name_tmp(column_name);#5、当大部分数据导入后,索引也建立好了,但是旧表数据量还是会因业务的增长而增长,这时候为了确保新旧表的数据一至性和平滑切换,建议写一个脚本,判断当旧表的数据行数与新表一致时,就切换。我是以 max(id)来判断的。table tb_name to tb_name_tmp1;table tb_name_tmp to tb_name;

当给新表加完索引后,最上面那条查询直接就是0.0002s

加索引卡死

场景:在给一张有几万条记录的表添加索引时,进度非常慢,导致其它查询无法进行

处理方式:
使用Navicat的命令行模式,执行以下命令:

show processlist;
这时会看到有哪些线程正在执行,也可以查看锁表的线程。你会发现alter table * add key ****那个线程状态是Waiting for table metadata lock,后面有个这个表的所有操作都是这个状态,很明显是这条加索引的语句把表给锁了。
查看线程ID,执行

kill 线程ID
这样被锁住的表就能立即被使用了。

由此得出一个结论,当一张表数据量很大时,不要轻易添加索引,会导致表被锁死!如果非要添加,那么应该先把数据表进行备份,然后进行空表添加索引。

Mysql online DDL 线上无锁添加索引

只能通过ALTER TABLE不能create index

ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;

参数说明:

ALGORITHM=INPLACE
更优秀的解决方案,在当前表加索引,步骤:
1.创建索引(二级索引)数据字典
2.加共享表锁,禁止DML,允许查询
3.读取聚簇索引,构造新的索引项,排序并插
入新索引
4.等待打开当前表的所有只读事务提交
5.创建索引结束ALGORITHM=COPY
通过临时表创建索引,需要多一倍存储,还有更多的IO,步骤:
1.新建带索引(主键索引)的临时表
2.锁原表,禁止DML,允许查询
3.将原表数据拷贝到临时表
4.禁止读写,进行rename,升级字典锁
5.完成创建索引操作LOCK=DEFAULT:默认方式,MySQL自行判断使用哪种LOCK模式,尽量不锁表
LOCK=NONE:无锁:允许Online DDL期间进行并发读写操作。如果Online DDL操
作不支持对表的继续写入,则DDL操作失败,对表修改无效
LOCK=SHARED:共享锁:Online DDL操作期间堵塞写入,不影响读取
LOCK=EXCLUSIVE:排它锁:Online DDL操作期间不允许对锁表进行任何操作

给1E数据库在线加索引

数据库在线加索引
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 7995759
Server version: 5.7.25-log Source distributionCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> use sdorica_expMySQL [sdorica_exp]> show index from gashapon_outcome_records;
Empty set (0.00 sec)MySQL [sdorica_exp]> select count(1) from gashapon_outcome_records;
+-----------+
| count(1)  |
+-----------+
| 111579926 |
+-----------+
1 row in set (1 min 10.13 sec)MySQL [sdorica_exp]> ALTER TABLE gashapon_outcome_records ADD INDEX idx_roll_gashapon_record_id (roll_gashapon_record_id) , ALGORITHM=INPLACE, LOCK=NONE;Query OK, 0 rows affected (15 min 34.16 sec)
Records: 0  Duplicates: 0  Warnings: 0MySQL [sdorica_exp]> show index from gashapon_outcome_records;
+--------------------------+------------+-----------------------------+--------------+-------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                    | Non_unique | Key_name                    | Seq_in_index | Column_name             | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------------------+------------+-----------------------------+--------------+-------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| gashapon_outcome_records |          1 | idx_roll_gashapon_record_id |            1 | roll_gashapon_record_id | A         |    51825872 |     NULL | NULL   | YES  | BTREE      |         |               |
+--------------------------+------------+-----------------------------+--------------+-------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.01 sec)MySQL [sdorica_exp]> 

Mysql大表加索引相关推荐

  1. mysql myisam表加索引_MyISAM和InnoDB的索引实现

    在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引.我们主要分析B-Tree 索引. B-Tree 索引是 MyS ...

  2. mysql myisam表加索引_MySQL中myisam和innodb的主键索引有什么区别

    ALTER TABLE t1 ADD INDEX(or CREATE INDEX) ALTER TABLE t1 ADD FULLTEXT INDEX ALTER TABLE t1 ADD COLUM ...

  3. Mysql给一个大表加一列_MySQL 大表添加一列的实现

    问题参考自: https://www.zhihu.com/question/440231149 ,mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改 ...

  4. 史上最全MySQL 大表优化方案(长文)

    转载自  史上最全MySQL 大表优化方案(长文) 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 一.单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑 ...

  5. MySQL 大表优化方案(1)

    转载自  干货!!!MySQL 大表优化方案(1) 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分 ...

  6. mysql 建表建索引

    Mysql建表与索引使用规范整理 一,设计表规范: MySQL建表,字段需设置为非空,需设置字段默认值: MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL: MySQL建表,如果 ...

  7. 解决MYSQL大表问题-实战篇(二)

    #首先上表结构 CREATE TABLE `sys_history` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`did` bigint(20) NOT NUL ...

  8. delete mysql 大表_无语了,直到今天,我才揪出MySQL磁盘消耗迅猛的“真凶”!

    作者:dbapower 链接:https://blog.51cto.com/suifu/2135599 背景 Part1:写在最前 当一张单表10亿数据量的表放在你面前,你将面临着什么? Part2: ...

  9. mysql 大表 备份_MySQL大表备份的简单方法

    MySQL大表备份是一个我们常见的问题,下面就为您介绍一个MySQL大表备份的简单方法,希望对您学习MySQL大表备份方面能有所帮助. 这里所说的大表是超过4G以上的表,我目前见到过最大为60多G的单 ...

最新文章

  1. JAVA用递归方法判断某个字串是否是回文
  2. java 套接字关联的通道_Java 通道教程 – NIO 2.0
  3. linux gstack pstack 进程运行堆栈查看工具
  4. SUSE Linux SFTP服务器配置
  5. Openstack 安装部署指南翻译系列 之 概况
  6. 如何将内核静态库编译连接到驱动程序中去【转】
  7. 网上找工作秘籍(3)
  8. 信息学奥赛一本通(2052:【例3.2】范围判断)
  9. 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计
  10. Win7中的clr_optimization服务
  11. 必背单词_考研英语语法如何高效自学? 真题必背单词Day12
  12. 电脑上没有iis组件,怎么才能安装iis?
  13. python+iOS自动化环境搭建
  14. 用ReadyBoost加速Windows 7
  15. 全球及中国医疗体制改革行业运作前景与发展策略研究报告2022年
  16. python中sys模块是干什么的_python中sys模块的介绍和使用
  17. 什么是软件危机?它有哪些典型表现?为什么会出现软件为危机?
  18. Excel 2016图表标题不能输入中文,图表一直闪动
  19. 帆软:根据参数查看不同报表
  20. CSS 各类选择器 第一节

热门文章

  1. 解决360,搜狗等国内各大流氓浏览器的最强四部曲
  2. android 主流机型排行,安卓手机性能排行:小米10 Pro第八,第一名果然是它
  3. 彩虹六号围攻服务器未响应,彩虹六号围攻运行错误解决办法汇总_3DM单机
  4. 李开复老师写给中国学生的第一封信
  5. sr里简体中文的代码_SRCNN代码分析 - osc_wq7ij8li的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 处理器CPU天梯图,显卡天梯图(性能排名图)
  7. C站最简单入门并且手把手教你学数组
  8. Linux上安装Oracle11g
  9. 《lol掌上联盟助手》上线
  10. 堆栈向上增长和向下增长