MySQL:**** 备用SQL ***

16 篇文章 0 订阅

1、 查看mysql数据库表使用情况(information_schema 库中)。根据占用大小降序。

SELECT * FROM `TABLES` order by DATA_LENGTH desc ;

TABLE_SCHEMA : 数据库名

TABLE_NAME:表名

ENGINE:所使用的存储引擎

TABLES_ROWS:记录数

DATA_LENGTH:数据大小

INDEX_LENGTH:索引大小

 

2、查看mysql数据文件位置。

show global variables like "%datadir%";

 

3、查询重复记录(可以以多个列为组)

select column_2 ,column3,count(*)  from table_name where column4 = 'x'  group by column_2 ,column3 having count(*) > 1

4、查询版本信息

select version();

5、查看数据库连接情况

show full processlist;  

6、查看缓存配置

show variables like '%query_cache%'

have_query_cache:是否在安装时已配置告诉缓存

query_cache_size:缓存区大小,单位MB

query_cache_type:0或者off缓存关闭,1或者on缓存打开,2或者demand(带有SQL_CACHE的select语句提供高速缓存)

 

-- 一、了解各种SQL的执行频率
show global status like 'Com_select'; -- 执行select操作的次数
show global status like 'Com_insert';
show global status like 'Com_update';
show global status like 'Com_delete';

show global status like 'Innodb_rows_read'; -- select 查询返回的行数
show global status like 'Innodb_rows_inserted'; 
show global status like 'Innodb_rows_updated';
show global status like 'Innodb_rows_deleted';

show global status like 'Connections'; -- 试图连接MySQL服务器的次数
show global status like 'Uptime';	-- 服务器工作时间
show global status like 'Slow_queries'; -- 慢查询的次数


show variables like '%slow%';	-- 查看慢查询日志的相关信息
show variables like 'long_query_time'; -- 指定记录慢查询日志SQL执行时间得伐值(单位:秒,默认10秒)
show variables like 'slow_query_log';	-- 慢查询日志的开关
show variables like 'slow_query_log_file'; -- 指定慢查询日志得存储路径及文件(默认和数据文件放一起)
show variables like 'log_queries_not_using_indexes'; -- 是否记录未使用***索引***的SQL
show variables like 'log_output'; --  日志存放的地方【TABLE】【FILE】【FILE,TABLE】(文件 和/或 表)
-- set global show_query_log=on; -- 开启慢查询日志

-- show processlist
select * from information_schema.processlist ; -- 查询当前MySQL在进行的线程


-- 二、通过执行计划查看SQL效率
EXPLAIN select id from bs_demo where id = 5;	-- 查看执行计划
EXPLAIN select * from bs_demo; 



-- 三、通过profile分析SQL。
select @@have_profiling ; 	-- 查看是否支持profile
select @@profiling;	-- 查看profile的开启状态
-- set profiling =1; -- 开启profile
select * from bs_demo;	-- 1、执行SQL
show profiles; -- 2、查看当前的profile内容和编号(找到第一步执行的SQL的编号)。
show profile for query 74; -- 3、查看指定编号的profile内容(每个状态和耗时)。
show profile cpu for query 28; -- 3、查看指定编号的profile在 cpu 资源上的耗时 (cpu可替换:all/block/io/context/switch/page faults等)
-- show profile all for query 59;

 

-- 四、trace分析优化器

SELECT * FROM information_schema.OPTIMIZER_TRACE;


7、查询、删除重复的记录

假设表user 存在2个列, id ,name 。 2列应为唯一且1对1 关系。 若存在重复的名字,则认为数据重复。

首先查询重复的记录,即记录超过1条。
 

select  name from  user group by name having count(*) > 1 -- 查询重复的名称

select * from user where name in (select name from user group by name having count(*) having count(*) > 1) -- 查询重复名称的记录行

删除重复的记录,这里的策略是,保留最小的id,将其余的都删除。
 

select min(id) from user group by name having count(*) > 1 -- 查询重复名称的记录并从中筛选出最小id的id值。

select name  from user group by name having count(*) > 1  -- 查询所有名称重复的记录

delete from user where name in (select name from user group by name having count(*) > 1) 
and id not in (select min(id) from user group by name having count(*) > 1) -- 删除除了最小id以外的所有名称重复的记录。


-- 这条与上一条效果一样,逻辑很精妙
delete from user A where id > (select min(id) from user B where A.name = B.name) -- 这是个自连接,当name重复时,会删除除最小id以外的记录,当name不重复时,id = min(id) 故不会删除。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值