MySQL的使用技巧

GROUP BYGROUP_CONCATCONCAT元数据视图表备份表空间占用情况

欢迎来到 来到大浪涛天的博客 !

一、MySQL的使用技巧

1.GROUP BY的详细说明:

GROUP BY 后接需要分组的列,添加该列执行后,数据库会先把该列的数据取出来先做一个排序,然后再去重,因此如果SELECT语句后面接着的该列如果没有被函数包裹进行运算或者没有GROUP_CONCAT做拼接的话会报错,这是为了保证查看的数据的完整性,如果不报错的话那去重后的值会丢失,这样显示的数据将没有任何意义,但这仅限于5.7的版本。

报错的本质是sql_mode开启了only_full_group_by的功能。

关于only_full_group_by的说明如下:

在5.7版本中MySQL sql_mode参数中自带,5.6和8.0都没有

在带有group by 字句的select中,select 后的条件列(非主键列),要么是group by后的列,要么需要在函数中包裹

如果需要开启或者关闭only_full_group_by则如下操作:

1. 查看该参数在sql_mode中是否存在或者开启

mysql> select @@sql_mode;

+-------------------------------------------------------------------------------------------------------------------------------------------+

| @@sql_mode |

+-------------------------------------------------------------------------------------------------------------------------------------------+

| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |

+-------------------------------------------------------------------------------------------------------------------------------------------+

2. 在/etc/my.cnf中添加一行.

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3. systemctl restart mysqld3307.service

4. 再次登陆到MySQL查看如下:

mysql> select @@sql_mode;

+------------------------------------------------------------------------------------------------------------------------+

| @@sql_mode |

+------------------------------------------------------------------------------------------------------------------------+

| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |

+------------------------------------------------------------------------------------------------------------------------+

2.GROUP_CONCAT的说明

group_concat配合group by使用是将直接将列转为行,因为group by后接着的列将会直接排序,去重(去重如果重复的列的多余的数据配合group_concat会转成行显示)。

列转行聚合函数,简单的事例如下:

mysql> SELECT user,host FROM mysql.user; (什么都没做,原本的数据)

+---------------+-------------+

| user | host |

+---------------+-------------+

| root | 10.211.55.% |

| mysql.session | localhost |

| mysql.sys | localhost |

| root | localhost |

+---------------+-------------+

4 rows in set (0.02 sec)

mysql> SELECT user,host FROM mysql.user GROUP BY user; (使用了GROUP BY对user列进行了排序并去重,结果是少了root的一行数据)

+---------------+-------------+

| user | host |

+---------------+-------------+

| mysql.session | localhost |

| mysql.sys | localhost |

| root | 10.211.55.% |

+---------------+-------------+

3 rows in set (0.01 sec)

mysql> SELECT user,GROUP_CONCAT(host) FROM mysql.user GROUP BY user; (在SELECT的后面对host列进行了GROUP_CONCAT拼接)

+---------------+-----------------------+

| user | GROUP_CONCAT(host) |

+---------------+-----------------------+

| mysql.session | localhost |

| mysql.sys | localhost |

| root | localhost,10.211.55.% |

+---------------+-----------------------+

3 rows in set (0.02 sec)

3.关于多表查询连接规则

首先找涉及到的所有表

找到表和表之间的关联列

关联条件写在on后面

A join B on 关联列

所有需要查询的信息放在select后

其他的过滤条件where group by having order by limit 网最后放

select 执行顺序:select user ,count(name) from 表 where 列 group by user having 列 order by 列 ;

需要特别注意的是:对多表连接中,因为驱动表不走索引,所以一般数据行较少表放在左边作为驱动表。后续所有表的关联列尽量是主键或唯一键(表设计),至少建立一个索引。

4.关于distinct去重的说明

MySQL中的distinct其实和SHELL里的uniq 一样的,直接在SELECT后跟着的列前面加上就可以直接去重,可以存在于函数包裹的括号里面。

例如:

mysql> SELECT count(distinct countrycode) from world.city;

+-----------------------------+

| count(distinct countrycode) |

+-----------------------------+

| 232 |

+-----------------------------+

1 row in set (0.07 sec)

mysql> SELECT count( countrycode) from world.city;

+---------------------+

| count( countrycode) |

+---------------------+

| 4079 |

+---------------------+

5.关于MySQL的视图说明:

视图是一个虚拟表,是sql的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ] ; 创建视图需要create view 权限,并且对于查询涉及的列有select权限;使用create or replace 或者 alter修改视图,那么还需要改视图的drop权限。

简单的来说视图类式于Linux里面的SHELL脚本,先把复杂的命令写好,然后每次需要查询的时候直接拿出来进行执行。

mysql> create view unpass as SELECT t.tname as '教师名',GROUP_CONCAT(CONCAT(st.sname,":",s.score)) as '不及格的同学' FROM teacher as t JOIN course as c ON t.tno=c.tno JOIN score as s ON c.cno=s.cno JOIN student as st ON s.sno=st.sno WHERE s.score <60 GROUP BY t.tno;

mysql> use school;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from unpass;

+-----------+--------------------+

| 教师名 | 不及格的同学 |

+-----------+--------------------+

| hesw | zhang3:59 |

| oldguo | li4:40,zh4:40 |

+-----------+--------------------+

6.MySQL的元数据的获取

6-1.MySQL元数据介绍:

元数据是存储在"基表"中,不可以直接进行修改

通过专用的DDL语句,DCL语句进行修改

通过专用视图和命令进行元数据的查询

information_schema中保存了大量元数据查询的试图

show 命令是封装好功能,提供元数据查询基础功能

6-2.information_schema的基本应用

6-2-1.tables 视图的应用

information_schema库里面包含了大量已经做好了的视图,而tables表里面又包含了大量非常有用的东西,如下所示:

mysql> use information_schema;

mysql> desc tables;

TABLE_SCHEMA 表所在的库名

TABLE_NAME表名

ENGINE存储引擎

TABLE_ROWS数据行

AVG_ROW_LENGTH平均行长度

INDEX_LENGTH 索引长度

6-3.重要的实例如下:

USE information_schema;

DESC TABLES;

6-3-1.显示所有的库和表的信息

SELECT table_schema,table_name FROM information_schema.tables;

6-3-2.以以下模式 显示所有的库和表的信息

world city,country,countrylanguage

SELECT table_schema,GROUP_CONCAT(table_name)

FROM information_schema.tables

GROUP BY table_schema;

6-3-3.查询所有innodb引擎的表

SELECT table_schema,table_name ,ENGINE

FROM information_schema.tables

WHERE ENGINE='innodb';

6-3-4.统计world下的city表占用空间大小

表的占用空间大小的计算方式如下

表的数据量=平均行长度*行数+索引长度

表的真实数据量占用大小=AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH

SELECT table_name,(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024

FROM information_schema.TABLES

WHERE table_schema='world' AND table_name='city';

如果不除以1024的话单位是字节,除以1024以后的单位是k

6-3-5.统计world库数据量总大小

SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024

FROM information_schema.TABLES

WHERE table_schema='world';

6-3-6.统计每个库的数据量大小,并按数据量从大到小排序

SELECT table_schema,SUM((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH))/1024 AS total_KB

FROM information_schema.TABLES

GROUP BY table_schema

ORDER BY total_KB DESC ;

6-3-7.配合concat()函数拼接语句或命令

如模仿以下语句,进行数据库的分库分表备份

mysqldump -uroot -p123 world city >/bak/world_city.sql

SELECT

CONCAT("mysqldump -uroot -p123 ",table_schema," ",table_name

," >/bak/",table_schema,"_",table_name,".sql")

FROM information_schema.tables;

模仿以下语句,进行批量生成对world库下所有表进行操作

ALTER TABLE world.city DISCARD TABLESPACE;

SELECT

CONCAT("ALTER TABLE ",table_schema,".",table_name," DISCARD TABLESPACE;")

FROM information_schema.tables

WHERE table_schema='world';

注意这个语句删除当前.ibd文件,常用于.ibd文件已经备份,用来快速导入数据,步骤如下:

ALTER TABLE tbl_name DISCARD TABLESPACE;

把备份的.ibd文件放回到恰当的数据库目录。

ALTER TABLE tbl_name IMPORT TABLESPACE;

6-4.show命令查看MySQL的元数据信息

show databases; 查看数据库名

show tables; 查看表名

show create database xx; 查看建库语句

show create table xx;查看建表语句

show processlist;查看所有用户连接情况

show charset;查看支持的字符集

show collation;查看所有支持的校对规则

show grants for xx;查看用户的权限信息

show variables like '%xx%' 查看参数信息

show engines;查看所有支持的存储引擎类型

show index from xxx查看表的索引信息

show engine innodb status\G 查看innoDB引擎详细状态信息

show binary logs 查看二进制日志的列表信息

show binlog events in ''查看二进制日志的事件信息

show master status ;查看mysql当前使用二进制日志信息

show slave status\G 查看从库状态信息

show relaylog events in ''查看中继日志的事件信息

show status like ''查看数据库整体状态信息

mysql里面使用技巧_MySQL的使用技巧相关推荐

  1. mysql数据库优化大全_MySQL数据库优化技巧大全

    简介: MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进 ...

  2. mysql百万级去重_mysql优化小技巧之去除重复项(百万级数据)

    mysql优化小技巧之去除重复项(百万级数据) 发布时间:2018-06-11 11:54, 浏览次数:482 , 标签: mysql 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候.毕竟咱不 ...

  3. mysql命令技巧_Mysql命令行技巧汇总

    29月/13 1) pager pager真是一个很神奇的东西,它可以控制mysql的输出.默认值是stdout,直接输出. 艾,貌似讲不清楚啊,还是看几个例子吧: mysql> SELECT ...

  4. mysql使用小技巧_MySQL使用小技巧

    1)忘记密码: 参考:https://www.jb51.net/article/108609.htm https://www.cnblogs.com/lemon-flm/p/7597879.html ...

  5. 提高MySQL数据库查询效率的几个技巧(转载)

    [size=5][color=Red]提高MySQL数据库查询效率的几个技巧(转)[/color][/size]       MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用. ...

  6. 总结MySQL建表、查询优化实用小技巧

    MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些实用小技巧. 技巧一.数据表冗余记录添加时间与 ...

  7. mysql建表测试_总结MySQL建表、查询优化实用小技巧

    MySQL建表阶段是非常重要的一个环节,表结构的好坏.优劣直接影响着后续的管理维护,赶在明天上班前分享总结个人MySQL建表.MySQL查询优化积累的一些实用小技巧. 技巧一.数据表冗余记录添加时间与 ...

  8. 30个mysql千万级大数据SQL查询优化技巧详解

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 文章来自:脚本之家 http://www.jb51.net/article/136701 ...

  9. Mysql 应用程序优化 管理 锁 使用技巧

    Mysql 应用程序优化 管理 锁 使用技巧 常用工具 日志 复制 Mysql高级 1.应用优化 1.1使用连接池 1.2减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2增加ca ...

最新文章

  1. java git subtree_Git subtree使用
  2. 高并发编程-自定义带有超时功能的锁
  3. c++ double 截取_c选择double小数点后自动截取3位,不...
  4. 【Pytorch神经网络实战案例】01 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-方法①
  5. mysql时长用什么类型_MySQL 日期时间类型怎么选?千万不要乱用!
  6. 蓝桥杯 ALGO-70 算法训练 最长字符串
  7. angular组件图标无法显示的问题
  8. mongodb副本集php,MongoDB副本集
  9. threeJs 入门
  10. lte测试软件中兴,中兴LTE网管操作_最新
  11. 基于C++的简易的国际象棋双人对战程序设计
  12. 魔兽地图编辑器插件YDWE的使用与基本设置4 物体编辑器、启动游戏测试、查找物品
  13. 免费压缩视频大小最佳方法?
  14. Android应用网络限制功能实现
  15. 解决 M1 MAC安装软件提示来自身份不明开发者
  16. 明翰经验系列之管理篇V1.1(持续更新)
  17. 读《MacTalk#183;人生元编程》及Mac经常使用软件
  18. 豆瓣影评爬虫:cutecharts数据可视化看看大家对八佰的评价如何
  19. ubuntu装机比做_与众不同总比做品牌设计案例研究更好
  20. 麻了!Spring Boot 从 2.2.5 升级到 2.7.2 之后,一堆BUG

热门文章

  1. 类似快手短视频播放器
  2. Vivado中DDR4的使用
  3. 评自主创新与自主实现
  4. 个人征信报告解析(机构版)
  5. 高中数理化杂志高中数理化杂志社高中数理化编辑部2022年第23期目录
  6. python学生管理系统
  7. Spring Data JPA 4.方法定义规范
  8. c语言选择结构程序设计实验报告6,c语言-选择结构程序设计实验报告4.doc
  9. python中if条件语句的代码实例
  10. 基于Python的ERP系统中主生产计划(MPS)的计算