关于MySQL5.7 这几天的总结(json类型)

一开始,老板让调整一下 innodb_buffer_pool_size 大小,因为这台机器内存大。

看了下内存,16G,再SQL下面命令,得到结果是4G。

SELECT @@innodb_buffer_pool_size; 

果断vim /etc/my.cnf

修改了 innodb_buffer_pool_size = 8G # (adjust value here, 50%-70% of total RAM)

括号中内容是官方给的建议。

然后再执行下面的命令,调整到8G,这样不用重启mysql服务,即调整完毕。

SET GLOBAL innodb_buffer_pool_size=8589934592;  -- 8G

其它的几个查询:

--  show status like ‘Threads%‘;   -- 连接数
--  show processlist;                             -- 查看连接,可以知道当前有哪些IP连接
--  select * from information_schema.processlist order by id;  -- 查看连接

最近才知道, mysql从5.7版本开始,增加了新的字段类型: json

所以在centos6.5上装了个5.7版本作为平时测试用.

#----------------------------------------------------------------------#
# 修改yum源为aliyun
# 先备份:
  mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载配置文件 注意 centos版本
  wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
  yum makecache  # 生成缓存
  # yum -y update  # 升级所有包同时也升级软件和系统内核 不是必要
#----------------------------------------------------------------------#

### --------------------------------------------------------------------###
# 安装 mysql 5.7版本 不同于低版本的安装,稍微复杂。 

yum list installed | grep mysql  # 检测系统是否自带安装mysql
yum -y remove mysql-libs.x86_64  # 删除系统自带的mysql及其依赖
# 给CentOS添加rpm源,并且选择较新的源
wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm --no-check-certificate
yum install mysql-community-release-el6-5.noarch.rpm
vim /etc/yum.repos.d/mysql-community.repo
# 编辑此文件,将MySQL 5.7下的 enabled=1  低版本的改成 enabled=0

yum repolist enabled | grep mysql    # 检查mysql57的源是否开启

# 安装mysql 服务器
yum install mysql-community-server
cat /var/log/mysqld.log | grep "password" # 找到临时密码
# 如果没有找到密码,则可能使用之前本机旧版本的密码。

service mysqld start

chkconfig mysqld on
mysql_secure_installation    # 设置安全选项

mysql -uroot -p  # 输入临时密码
SET PASSWORD = PASSWORD(‘your password‘); # 设置新密码

# 如果远程连接出错:‘performance_schema.session_variables‘ doesn‘t exist
# 则操作以下命令并重启服务后,再连接
mysql_upgrade -u root -p --force
service mysqld restart

设计表的时候, 字段类型直接选json  就像平常选varchar一样.

插入数据的时候, 需要转成JSON_OBJECT 。 而JSON_ARRAY 用来将多个值存成数组。 如下面的示例:

SELECT mac, JSON_OBJECT(‘e1‘,JSON_ARRAY (round( AVG( value ->> ‘$.e1‘ ), 3 ),MIN( value ->> ‘$.e1‘ ),MAX( value ->> ‘$.e1‘ )),‘e2‘,JSON_ARRAY (round( AVG( value ->> ‘$.e2‘ ), 3 ),MIN( value ->> ‘$.e2‘ ),MAX( value ->> ‘$.e2‘))) as json FROM history
WHERE
  mac =‘522099e6660004‘ and time between ‘2018-08-07 00:00:00‘ AND ‘2018-08-08 00:00:00‘
GROUP BY
  mac

value是表中的字段名,e1、e2是此字段中json的key,  AVG/MIN/MAX不用多说了,大家都知道。 此句的作用是以某mac字段和时间为限定,分别取出e1的avg/min/max,然后赋给一个新的数组 “e1", 取出e2的avg/min/max,然后赋给一个新的数组 “e2",然后组成json对象,得到下面的结果。

{"e1": [25.568, 12, 121], "e2": [28.631, 12, 182]}

取值的时候,取json里面的键,可以直接用SQL语句,像下面这么写:

value -> ‘$.e1‘     表示取出json型字段名为value中的 e1 健的值. 即使取出的数字,也带有双引号value ->> ‘$.e1‘    则取出数字不带有双引号, 但此时仍然不是数值类型. JSON_UNQUOTE(json_extract(json,‘$.attr‘)) 也可以去掉引号. value ->> ‘$.e1‘+0  则会强制将取出的字符型数字转为数值类型. CAST(‘123‘ AS SIGNED) 或 CONVERT(‘123‘,SIGNED)的函数也行,但是执行速度没有直接 +0 快. (必须看起来的确是数字)

如果跑py脚本,没有安装环境,则依次执行以下命令。

或者参考更详细的python升级2.7    https://www.cnblogs.com/frx9527/p/python27.html

yum install gcc gcc-c++ -y 

yum -y install mysql-devel 

yum install python-devel 

pip install --upgrade pip

pip install MySQL-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

以下脚本运行在python2.7   因为python3以上不再有 MySQLdb

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb, time, datetime, json
print(datetime.datetime.now())
HOST = ‘node-6‘

db = MySQLdb.connect(HOST, "root", "123456", "monitor_db")
cursor = db.cursor()

def get_date(str_date):
    t = time.strptime(str_date, ‘%Y-%m-%d‘)
    y, m, d = t[0:3]
    return datetime.datetime(y, m, d)

def insert_device_data(cursor, data):
    sql = "INSERT INTO history_daily (mac, time, json) VALUES (%s, %s, %s)"
    # print sql
    cursor.executemany(sql, data)

def fetch_device_minutely_data(cursor, start, end, mac):
    try:
        sql = ‘‘‘
                SELECT
                    mac,
                    CASE version %s
                    END json
                FROM
                    history
                WHERE
                    mac =‘%s‘
                    and time between ‘%s‘ AND ‘%s‘
                GROUP BY
                    mac,
                    version
            ‘‘‘ % (jsonkey, mac, start, end)
        # print(sql)   # 壮观的 case ... when

        cursor.execute(sql)
        data = cursor.fetchall()
        if data:
            for d in data:
                mac = d[0]
                json = d[1]
                device_data = []
                device_data.append((mac, start, json))
                insert_device_data(cursor, tuple(device_data))
    except MySQLdb.OperationalError, e:
        print(e)
        time.sleep(10)
        db = MySQLdb.connect(HOST, "root", "123456", "monitor_db")
        cursor = db.cursor()
        fetch_device_minutely_data(cursor, start, end, mac)

# 设备表 id , version
version_sql = ‘SELECT id, version FROM device_version GROUP BY id, version‘
cursor.execute(version_sql)
versions = cursor.fetchall()  # version 从2到10

jsonkey = ""
if versions:
    for version in versions:
        print (version[0])
        sensor_sql = ‘‘‘
                SELECT s.sensor_key FROM device_version_sensor dvs,sensor s WHERE dvs.sensor_id = s.id AND dvs.device_version_id = ‘%d‘
            ‘‘‘ % (version[0])  # e1  e2  e3  ...
        cursor.execute(sensor_sql)
        keys = cursor.fetchall()
        if keys:
            jsonkey += "WHEN " + str(int(version[1])) + " THEN JSON_OBJECT("
            for i, sensorKey in enumerate(keys):
                key = sensorKey[0]
                jsonkey += "‘" + str(key) + "‘,JSON_ARRAY (round( AVG( value ->> ‘$." + str(
                    key) + "‘+0 ), 3 ),MIN( value ->> ‘$." + str(
                    key) + "‘+0 ), MAX( value ->> ‘$." + str(key) + "‘+0 ))"
                if i != len(keys) - 1:
                    jsonkey += ","
            jsonkey += ")"

# mac 列表
sql_mac = ‘SELECT DISTINCT mac FROM `history` where mac is not NULL‘;

cursor.execute(sql_mac)
mac_tuple = cursor.fetchall()  # version 从2到10

start_date = get_date((datetime.datetime.now() + datetime.timedelta(days=-6)).strftime("%Y-%m-%d"))
end_date = get_date((datetime.datetime.now()).strftime("%Y-%m-%d"))

days = (end_date - start_date).days

for i in range(days):
    start_day = start_date + datetime.timedelta(days=i)
    end_day = start_date + datetime.timedelta(days=i + 1)

    for mac in mac_tuple:
        # print (mac[0])
        fetch_device_minutely_data(cursor, start_day, end_day, mac[0])
        db.commit()

db.close()

print(datetime.datetime.now())

SQL语句创建简单的定时任务,每天凌晨执行前一天的数据汇总,求取表中每个城市的最大值。

对应地将json中的quality值由汉字转换为数字,先存入临时表,最后求取个最大值存放到 quality_daily 表中。如果SQL搞定没问题,就没必要麻烦python了。
  定义:

begin
-- 取出所有 quality
INSERT INTO quality_tmp ( time, quality, city_code ) SELECT
DATE_FORMAT( time, "%Y-%m-%d" ) AS time,
IF
    (
        aqi_json ->> "$.quality" = "优",
        1,
    IF
        (
            aqi_json ->> "$.quality" = "良",
            2,
        IF
            (
                aqi_json ->> "$.quality" = "轻度污染",
                3,
            IF
                ( aqi_json ->> "$.quality" = "中度污染",
                4,
                IF
                ( aqi_json ->> "$.quality" = "重度污染",
                5,
                    IF(aqi_json ->> "$.quality" = "严重污染", 6, 0)) )
            )
        )
    ) AS quality,
    city_code
FROM
    `hangzhou_aqi`
WHERE
    time >= date_sub( curdate( ), INTERVAL 1 DAY )
    AND time < curdate( );
-- 求出最大值
INSERT into quality_daily(time,quality,city_code)
SELECT time, max(quality), city_code from quality_tmp GROUP BY time,city_code ;
-- 清空临时表
delete from quality_tmp;
end

设定 计划 为每一天。

原文地址:https://www.cnblogs.com/FHBIAO/p/10174581.html

时间: 2024-10-17 08:49:37

关于MySQL5.7 这几天的总结(json类型)的相关文章

MySQL5.7 JSON类型使用介绍

JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写.对机器来说易于解析和生成,并且会减少网络带宽的传输.    JSON的格式非常简单:名称/键值.之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本. MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析. 我们先看看MySQL老版本的JSON存取. 示例表结构: CREATE TABLE json_test( id INT

【原创】MySQL5.7 JSON类型使用介绍

JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写.对机器来说易于解析和生成,并且会减少网络带宽的传输. JSON的格式非常简单:名称/键值.之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本. MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析. 我们先看看MySQL老版本的JSON存取. 示例表结构: CREATE TABLE json_test( id INT, p

MySQL5.7中新增的JSON类型的使用方法

创建表json_test: CREATE TABLE json_test(id INT(11) AUTO_INCREMENT PRIMARY KEY,person_desc JSON)ENGINE INNODB; 插入一条记录: INSERT INTO json_test(person_desc) VALUES ('{       "programmers": [{           "firstName": "Brett",         

centos7.2安装mysql5.7.13

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 另外本博文内使用的全部软件和文件,博友如有需要可以去我百度云分享下载,分享地址是: 链接:http://pan.baidu.com/s/1bpaOqa7 密码:r2js 一.MySQL 5.7主要特性: 原生支持Systemd 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 更好的InnoDB存储引擎 更为健壮的复制功能:复制带来

mysql5.7新特性探究

一.MySql5.7增加的特性 1.MySql服务方面新特性 1) 初始化方式改变 MySql5.7之前版本初始化方式: scripts/mysql_install_db MySql5.7版本初始化方式: [[email protected] mysql_new]# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql_new/ --datadir=/usr/local/mysql_new/data/ 2015-10-

基于rhel7.2的mysql5.7.13安装与配置

基于rhel7.2的mysql5.7.13安装与配置 一.实验环境: (1)虚拟机:vmware workstation 12 (2)操作系统:rhel 7.2 X86_64 (3)数据库:mysql5.7.13 二.MySQL 5.7主要特性: 原生支持Systemd 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 更好的InnoDB存储引擎 更为健壮的复制功能:复制带来了数据完全不丢失的方案,传统金融客户也可以选择使用MySQL数据库. 注:从mysql5.6.3版本开始就已经支持了

MySql之centos7.2安装mysql5.7.13

一.MySQL 5.7主要特性: 原生支持Systemd更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化更好的InnoDB存储引擎更为健壮的复制功能:复制带来了数据完全不丢失的方案,传统金融客户也可以选择使用MySQL数据库. 新增sys库:以后这会是DBA访问最频繁的库更好的优化器:优化器代码重构的意义将在这个版本及以后的版本中带来巨大的改进,Oracle官方正在解决MySQL之前最大的难题原生JSON类型的支持(JavaScript Object Notation) 注:JSON(Ja

关于mysql5.7的一些变化

最近接了个项目,使用的数据库是5.7的,开始没太在意,但是在接手的过程中发送了些小插曲,特意记录下来. 首先,我想自己安装个noinstall版本的,结果发信下载下来的和之前版本的不一样,没有data目录,my.ini 里几乎没有内容,看来使用以前的办法是不行了,看了下官方的文档.基本有下面3步需要做, 确定好mysql的根目录,mysql的数据存储目录,按我的情况 D:/mysql 是根目录,我自己在这个目录下建了个data目录做数据存储目录 D:/mysql/data ,然后配置在my.in

Centos7.2 Systemd 方式编译 Mysql5.7.11

导读 MySQL 5.7 版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 原生支持Systemd 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 更好的InnoDB存储引擎 更为健壮的复制功能:复制带来了数据完全不丢失的方案,传统金融客户也可以选择使用MySQL数据库.此外,GTID在线平滑升级也变得可能 更好的优化器:优化器代码重构的意义将在这个版本及以后的版本中带来巨大的改进,Oracle官方正在解决MySQL