文章

mysql-sql小技能

1.select查询结果以指定字符串分割

1
select concat_ws('|', page_id, cache_time, last_cache_time) from a_page;

2.格式化时间

1
DATE_FORMAT(last_cache_time,'%Y%m%d%H%i%s')

3.表备份

1
create table e_email_0_bak_202011122005 select * from e_email_0;

4.查看数据运行时长,判断是否宕机

1
show global status like 'uptime';

5.批量删除表

1
2
3
select concat("DROP TABLE IF EXISTS ", table_name, ";") from information_schema.tables where table_schema="Your_database_name";

将查询出的

6.批量杀死进程

1
2
3
4
5
6
7
8
9
bash命令行:
获取id
for i in $( mysql -t -A -h 127.0.0.1 -P 3306 -uroot -pyTaFp=4vH@gKAp86kC -e "show processlist" | awk -F"|" '{print $2}'  |grep -Ew "[0-9]+")
do 
    echo $i
done

删除进程
echo $i 改为 kill $i

7.高并发insert ignore是选择innodb还是myisam? tokudb好像也可以

(1) 如果不是对事务要求非常的强,高并发写推荐选择MyISAM。

  1. MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少,能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小;
  2. InnoDB存储引擎在插入数据时会花更多的开销在维护完整性、维持事务上,所以效率比MyISAM低;
  3. 就查询速度而言,MyISAM比InnoDB更优越,并且还有MyISAM索引,可以很好的优化查询速度

(2) 如何提高INSERT效率

  1. 批量插入VALUES,而不是每一次插入都是一条数据
  2. 删除MySQL的索引,有索引存在插入速度会受很大的影响;
  3. 题主的表有3个int字段,并且都是唯一索引,可以指定一个主键。

(3)三种插入方法,insert into、replace into及insert ignore

8.mysql数据库引擎切换

1
2
3
4
5
#未测试过
mysql5.1版本之后:
    ALTER TABLE t1 ENGINE = InnoDB;
mysql5.1版本之前:
    alter table kcb type = InnoDB;

9.mysql binlog日志自动清理及手动删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 如果没有主从可不在意

1.关闭mysql主从,关闭binlog;配置文件
vim /etc/my.cnf
    屏蔽 关于 log-bin 的全部删除
    # log-bin=mysql-bin
    # binlog_format=mixed

2.开启mysql主从,设置expire_logs_days;
永久修改
vim /etc/my.cnf
    # x 是自动删除的天数, 最大99天
    # 默认值为0,表示“没有自动删除”
    expire_logs_days = x

临时修改
> show variables like 'expire_logs_days';  
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
> set global expire_logs_days = 99;
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 99    |
+------------------+-------+
> flush log; #直接生效

3.手动清除binlog文件
> PURGE MASTER LOGS TO 'MySQL-bin.010';  //清除MySQL-bin.010日志
> PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';   //清除2008-06-22 13:00:00前binlog日志
> PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);  //清除3天前binlog日志BEFORE,变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。

本文由作者按照 CC BY 4.0 进行授权