MYSQL的常用实用功能

(1)show create table
比如 >>desc 'order' 能够看到order表中的字段名称、字段类型、字段长度、是否允许为空,是否主键、默认值等信息。不能看到该表的索引信息
查看字段和索引数据直观呈现,例如:
show create table `order`;
我们能够看到非常完整的建表语句,表名、字段名、字段类型、字段长度、字符集、主键、索引、执行引擎等都能看到。

(2)create table ... select
 

快速备份表。

通常情况下,可以分两步走:

  1. 创建一张临时表
  2. 将数据插入临时表

创建临时表可以使用命令:
create table order_2022121820 select * from `order`;

执行完之后,就会将order_2022121820表创建好,并且将order表中的数据自动插入到新创建的order_2022121820中,一个命令就能轻松搞定表备份

(3)explain

我们优化一条sql语句的性能,需要查看索引执行情况。

答:可以使用explain命令,查看mysql的执行计划,它会显示索引的使用情况

例如:explain select * from `order` where code='002';

索引失效的常见原因: 

 

(4)show processlist
线上sql或者数据库出现了问题。比如出现了数据库连接过多问题,或者发现有一条sql语句的执行时间特别长。

答:我们可以使用show processlist命令查看当前线程执行情况

(5)mysqldump
使用mysqldump工具,该工具会将数据查出来,转换成insert语句,写入到某个文件中,相当于数据备份

备份远程数据库中的数据库:
mysqldump -h 192.22.25.226 -u root -p123456 dbname > backup.sql

(6)防止重复数据的做法很多,比如:加唯一索引加分布式锁等,

但这些方案,都没法做到让第二次请求也更新数据,它们一般会判断已经存在就直接返回了。

这种情况可以使用on duplicate key update语法。

该语法会在插入数据之前判断,如果主键或唯一索引不存在,则插入数据。如果主键或唯一索引存在,则执行更新操作。

INSERT  INTO `brand`(`id`, `code`, `name`, `edit_date`) VALUES (123, '108', '苏三', now(3)) on duplicate key updatename='苏三',edit_date=now(3);

但需要注意的是,在高并发的场景下使用on duplicate key update语法,可能会存在死锁的问题,所以要根据实际情况酌情使用。

(7)
select ... for update

MYSQL数据库自带了悲观锁,它是一种排它锁,根据锁的粒度从大到小分为:表锁间隙锁行锁

在我们的实际业务场景中,有些情况并发量不太高,为了保证数据的正确性,使用悲观锁也可以。

比如:用户扣减积分,用户的操作并不集中。但也要考虑系统自动赠送积分的并发情况,所以有必要加悲观锁限制一下,防止出现积分加错的情况发生。

这时候就可以使用MYSQL中的select ... for update语法了

例如:

begin;
select * from `user` where id=1 
for update;

//业务逻辑处理

update `user` set score=score-1 where id=1;
commit;


(8)char_length 通过该函数就能获取字符长度
例:
select * from brand where name like '%苏三%' order by char_length(name) asc limit 5;

(9)group_concat

把name相同的code拼接在一起,放到另外一列中该怎么办呢?

答:使用group_concat函数。

 select name,group_concat(code) from `user` group by name;

 

 

 




 

 

 

 


 
 
posted @ 2022-12-27 11:53  xiaowangzi3668  阅读(95)  评论(0)    收藏  举报