Mysql的进阶小记

作者:邓聪聪

授权账号:
grant all on Syslog.* to loguser@'10.0.0.%' identified by '123456';

mysql的相关添加项,增加安全性
/etc/my.cnf #服务端的操作
1;innodb_file_per_table #每张表的数据由单独文件保存 --show variables like '%per_table%' #查询开关状态
2;character-set-server=utf8mb4 #设置服务实例的字符集统一 --status
3;slow_query_log #慢查询日志开关
4;long_query_time=3 #设置慢查询的定义时间
5;log_queries_not_using_indexes #启用未使用索引的的慢语句记录

/etc/my.cnf.d/mysql-clients.cnf #mysql客户端的操作
1;default-character-set=utf8mb4 #设置字符集统一
2;safe-updates #设置删除、更新都为安全模式,防止误操作的严重后果 --mysql -U #安全模式

通用日志记录:--一般用于分析或者优化时去使用
1;show variables like 'general_log'; --文件的形式存在 #查询开关 --set GLOBAL general_log=on; #设置开启
2;show variables like 'log_output'; #默认是文件形式存在,修改存储进表 --set global log_output='table'; #设置存入mysql数据库的表中

慢查询开关;
1;show variables like 'slow_query_log';
2;select @@long_query_time; #查询默认的慢查询时间,默认是10s
3;set profiling=ON; #慢查询分析工具 --show profiles; #查编号 --show profile for query 2; #分析某个语句的慢动作原因

二进制日志的存储
1;show variables like 'binlog_format'; #分为3中模式,1基于语句--不推荐,2基于行记录,3有系统判定自动选择方式


查看是否启用索引
1;select @@log_queries_not_using_indexes;
2;show indexes from t1; #查看表内的索引信息

创建索引,优化语句的查询速度
1;create index idx_age on t1(age);

建表结构:
1;create table t1 (id int, name varchar(10), address varchar(20));
2;insert t1 values (3,'张三','天津');


语句去重
select distinct 字段 from 表;

查询语句 #DQL
例:
MariaDB [students]> select * from t1;
+----+---------+--------+------+-----------+
| id | name | gender | age | address |
+----+---------+--------+------+-----------+
| 3 | 张s三 | 男 | 18 | 北京 |
| 4 | 李四 | 男 | 20 | 天津 |
| 5 | 陆琴 | 女 | 22 | 河北 |
| 6 | 刘六 | 男 | 21 | 黑龙江 |
+----+---------+--------+------+-----------+
1;select gender as '性别',avg(age) as '平均年龄' from t1 group by gender; #查询以男、女为分别的平均年龄并分组,其中as为别名
2;select classid,gender,count(*) from t1 group by classid,gender; #查询以班级为分组的男生和女生的总数
3;select * from t1 order by age asc/desc; #排序 --默认从小打到,desc #从大到小
4;select classid,gender,avg(age) from t1 group by classid,gender having avg(age) > 21; #以班级分组,显示平均年龄,且平均年龄大于avg(age)的
5;select * from t1 where age between 21 and 25; #介于两者之间
同 select * from t1 where age >21 and age< 25; #介于两者之间
不同 select * from t1 where age in (21,25); #只显示匹配的信息

联表查询:
例:
MariaDB [students]> select * from t2;
+----+--------+-----+---------+
| id | name | age | address |
+----+--------+-----+---------+
| 1 | 手打 | 29 | 河北 |
| 2 | 特 | 33 | 法国 |
| 3 | 华通 | 33 | 天津 |
| 4 | 打算 | 32 | 武汉 |
+----+--------+-----+---------+
一,纵向合并查询,条件是记录一样,如(字段数相同)或字段一样 union #*具有去重的效果
1;select id,name,age,address from t1 union select * from t2;两张表纵向合并显示,字段需要对应上,否则无法合并
二,横向合并,两张表的字段横向展开,内容对内容进行横向排列cross join,交叉连接
1;select * from t1 cross join t2;
挑出条件的显示
//1;select * from t1,t2 where techerid=t2.id; #把两表的交集作为条件查询 --老式查询//
2;select * from t1 inner join t2 on techerid=t2.id; #把两表的交集作为条件查询

猜你喜欢

转载自www.cnblogs.com/dengcongcong/p/10803809.html