命令记录|SQL&mysql核心知识总结

本文主要记录工作中遇到的常用和重要的sql语句


下文所有命令默认为mysql环境,如果在其他数据库如ti-db等环境运行,特别注意预先评估是否兼容


一、基本命令

1.连接服务器、定位表、查询表结构等

	# 非容器环境用客户端连接服务端
	mysql -h127.0.0.1 -P3306 -uxxx -pxxx
	# 容器环境下连接服务端(ti-db端口默认4000)
	mysql -hbasic-tidb -P4000 -uxxx -pxxx # 如果配置了服务名的dns,-h可以使用对应的service-name
	kubectl get svc -A | grep tidb	# 获取clusterIp地址,如下图此处为:10.100.65.37
	mysql -h10.100.65.37 -P4000 -uxxx -pxxx
	
	show databases;		# 查看所有库信息
	use database_xxx;	# 进入指定的数据库
	show tables like '%xxx%';	# 根据表的关键字模糊匹配表
	desc table_xxx;		# 描述指定表的所有字段信息
	# 将11位时间戳格式化显示:from_unixtime(time_millisecond/1000)
	SELECT time_millisecond,from_unixtime(time_millisecond/1000) from 表名 ORDER BY time_millisecond desc limit 1;

在这里插入图片描述

2.修改表结构

	# 更新数据
	update table_xxx set column1 = value1, column2 = value2 where ……;
	# 增加字段
	ALTER TABLE table_name ADD column_name datatype;
	# 删除字段
	ALTER TABLE table_name DROP column_name datatype;	
	# 修改字段类型
	ALTER TABLE table_name MODIFY COLUMN column_name datatype;
	# 删除索引
	DROP INDEX 索引名 ON 表名;
	# 修改索引
	ALTER TABLE 表名 ADD INDEX 索引名 [索引类型] (列名,);

3.文件操作

	# 使用mysql工具批量执行sql文件
	mysql -h127.0.0.1 -P3306 -uxxx -pxxx < xxx.sql
	# 导出ddl和dml(常用于批量备份数据)
	mysqldump -h127.0.0.1 -P3306 -uxxx -pxxx database_xxx table_xxx > xxx.sql

4.性能监控场景

	select version();	# 查看数据库版本号
	select "10" > 9;	# 测试数据库的数据类型转换规则
	# 查看指定库中超过阈值的表
	select table_name,table_rows from information_schema.tables where table_schema in ('database_1','database_2') and table_rows>100000 order by table_rows desc;
	# explain语句
	explain sql_str;

二、explain语句查询结果指标说明:

在这里插入图片描述

id

表示查询中执行select子句或操作表的顺序,id相同顺序执行,id越大越先执行

type

常见的执行效率从低到高的顺序为:
All(全表扫描);
index(全索引扫描)对索引表进行全扫描,这样做的好处是不再需要对数据进行排序;
range(索引范围扫描)一般在 where 子句中使用 < 、>、in、between 等关键词,只检索给定范围的行,属于范围查找;
ref(非唯一索引扫描)或唯一索引的非唯一性前缀,返回数据返回可能是多条,一般会在一个非常小的范围内扫描;
eq_ref(唯一索引扫描)常使用在多表联查中;
const(结果只有一条的主键或唯一索引扫描)。

possible_keys

字段表示可能用到的索引

key

用到的索引的索引名

ken_len

用到的索引的字段的长度,与表的字符编码、索引字段数量、字段长度、是否允许NULL(加2)有关

Extra

Using filesort :当查询语句中包含 group by 操作,而且无法利用索引完成排序操作的时候, 可能会通过文件排序。
Using temporary:使了用临时表保存中间结果,对查询结果排序时使用临时表,常见于排序 order by 和分组查询 group by。
Using index:即使用了覆盖索引,避免了回表操作。
Using index condition:对联合索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

索引覆盖:查询语句中的所有返回字段,在用到的二级索引的叶子节点都可以找到,避免再次回表操作
索引下推:(index condition pushdown)在联合索引的情况下,类似"where a > 1 and b = 2"的条件。在5.6版本之前需要从存储引擎中依次将a > 1的数据读取到server层,然后再根据b = 2条件看是否满足,如果满足就返回给客户端不满足就继续下一条,一直循环。在5.6版本之后,b = 2的条件判断就直接在存储引擎层判断了,不需要再返回sever层进行判断。我的理解是:之前再server层进行判断,现在在下层存储引擎层进行判断,所以叫做下推

三、索引以及索引失效的情况总结

1.左模糊匹配,like ‘%xxx’ like ‘%xxx%’

2.函数,where length(name)=6

3.进行表达式计算,where id - 1 = 9

4.类型转换 select “10” > 9

5.联合索引缺少最左条件

6.where子句中的or,一边非索引字段


总结

参考小林coding

B+Tree----B Tree相同数据量下,B+Tree比B Tree树低,磁盘IO次数更少;B+Tree叶子节点通过双向链表连接,更适合范围查询
B+Tree----二叉树二叉树的层高会越来越高,而B+Tree在千万级别数据情况下,树高依然维持在3~4层,意味着最多几次oi就可以查询到数据
B+Tree----Hashhash结构等值查询性能高,但是却无法做到范围查询
什么时候适合创建索引?1.字段唯一 2.经常作为where条件 3.经常用于order by或group by
什么时候不适合创建索引?1.不作为where、order by或group by条件查询 2.索引区分度很小(存在大量重复值的情况) 3.表数量很少 4.经常会发生修改的字段不适合创建索引
常用索引优化1. 前缀索引 2. 索引覆盖,减少回表 3. 主键索引最好自增 4.防止使用索引失效的语句进行查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值