首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事
您的当前位置:首页正文

MySQL -MMM 学习整理

2023-11-12 来源:好兔宠物网

/etc/selinux/config SELINUX=disabled

2. 关闭防火墙

systemctl stop firewalldsystemctl disable firewalld
3. 配置NTP ,同步时间
yum -y install ntpvi /etc/ntp.conf增加3个时间服务器server s2d.time.edu.cn iburst #西南地区网络中心server s2e.time.edu.cn iburst #西北地区网络中心server s2f.time.edu.cn iburst #东北地区网络中心

 4. 启动ntp服务

systemctl start ntpdsystemctl enable ntpd

 5. 调整为上海时区

timedatectl set-timezone Asia/Shanghai # 设置系统时区为上海

查看状态

ntpq –p

 

四.安装MySQL 5.6 (不是MariaDB)1.安裝 MySQL Repository
rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
2.安裝 MySQL Server, MySQL client
yum install mysql-community-server
3.开机自动启动 MySQL
systemctl enable mysqld
4.启动MySQL
systemctl start mysqld
5.MySQL 预设为空密码, 執行以下指令修改
mysql_secure_installationmysql -u root -p

#进入mysql 控制台,增加root用户远程登录的权限

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY ‘GDkyUDJM6gr2Dx‘ WITH GRANT OPTION;flush privileges;
6.修改mysql的存储目录
a. 停止mysqlsystemctl stop mysqlb. 迁移数据库存储目录mkdir /opt/mysqlchown mysql:mysql /opt/mysqlmv /var/lib/mysql /opt/mysqlcd /opt/mysqlmv mysql datac. 修改配置文件vim /etc/my.cnf#修改datadir和socket指向datadir=/opt/mysql/datasocket=/opt/mysql/mysql.sock#同时增加下面的代码,这个是为了让mysql client能够连上mysql,避免Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock错误![mysql]socket=/opt/mysql/mysql.sockd. 启动mysqlsystemctl start mysql
7. 配置MySQL Relication
a. 在/opt/mysql下增加log目录主要内容如下: [mysqld]datadir=/opt/mysql/datasocket=/opt/mysql/mysql.sockuser=mysql#下面为新添加的内容read_only=1default-storage-engine=innodbreplicate-ignore-db=mysql,information_schema #不同步的数据库,多个写多行replicate-do-db=mysqltest #同步的数据库,多个写多行 binlog-ignore-db=mysql,information_schema #不需要记录二进制日志的数据库,多个用逗号隔开binlog-do-db=mysqltest #需要记录二进制日志的数据库,多个用逗号隔开# 以下这三个参数一定要同时在my.cnf中配置。否则在mysql.err中会出现报错 gtid_mode= onlog_slave_updates=1 #当一个主故障,另一个立即接管enforce_gtid_consistency= 1 # 三个参数设置结束sync-binlog=1 #每条自动更新,安全性高,默认是0 server-id = 1 #server-id在每台服务器上的值都是不一样,在这里依次为1、2、3、4。 #这里的日志文件命名也每台机器不一样,比如(mysql-master-001-bin.log,mysql-master-002-bin.log,mysql-slave-001-bin.log,mysql-slave-002-bin.log) g-bin = /opt/mysql/log/mysql-master-001-bin.loglog_bin_index = /opt/mysql/log/mysql-master-001-bin.log.indexrelay_log = /opt/mysql/log/mysql-master-001-bin.relayrelay_log_index = /opt/mysql/log/mysql-master-001-bin.relay.index# 日志文件指定结束expire_logs_days = 10max_binlog_size = 100Mlog_slave_updates = 1

 

更加详细的用于生产环境的配置 见这篇文章 生产环境的mysql 5.6 和 5.7 的配置文件my.cnf

 

b. 在/opt/mysql下增加log目录cd /opt/mysqlmkdir logchown mysql:mysql logc. 重新启动mysqlsystemctl restart mysqle. 检查配置是否成功 1)登录mysql,执行show master status,看是否有如下输出 +——————+———-+————–+——————+——————-+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +——————+———-+————–+——————+——————-+ | mysql-master-001-bin.000001 | 120 | | mysql | | +——————+———-+————–+——————+——————-+ 2)到/opt/log/mysql目录下,看是否产生了类似mysql-master-001-bin.000001和mysql-master-001-bin.log.index的文件。f. 在4个mysql的服务器上都修改一下。注意日志命名每台机器都不一样

 

五.新建同步数据库需要的用户
使用mysql-mmm时一共需要三个用户: replication、mmm_agentmmm_monitor(管理服务器上用来监控cluster状态的用户,所以可以限定只能从管理服务器登录)。使用下面三条命令新建这三个用户并分配相应的权限 所有的mysql 服务器都运行一遍GRANT REPLICATION CLIENT ON *.* TO ‘mmm_monitor‘@‘10.0.0.%‘ IDENTIFIED BY ‘monitor‘;GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO ‘mmm_agent‘@‘10.0.0.%‘ IDENTIFIED BY ‘agent‘;GRANT REPLICATION SLAVE ON *.* TO ‘replication‘@‘10.0.0.%‘ IDENTIFIED BY ‘replication‘;flush privileges;

 

六.设置复制机制

(从master-001复制到master-002,从master-002复制到slave-001,slave-002)

1.配置master-001作为主,复制到master-002a.配置master-001由于这里是配置master-001做为源数据,所以不需要设置change master 和 启动slave进程b.配置master-002(指定 change master 为 master-001,表示从master-001 复制到 master-002) #ssh到 master-002 服务器mysql -u root -p#在mysql控制台录入#这个是在my.cnf中没有使用GTID(MySQL5.6新特性)下的命令#CHANGE MASTER TO MASTER_HOST=‘10.0.0.5‘,MASTER_USER=‘replication‘,MASTER_PASSWORD=‘replication‘,MASTER_PORT=3306,MASTER_LOG_FILE=‘mysql-master-02-bin.000001‘, MASTER_LOG_POS=260,MASTER_CONNECT_RETRY=10;# 这个是在my.cnf中使用GTID(MySQL5.6新特性)下的命令CHANGE MASTER TO MASTER_HOST=‘10.0.0.5‘,MASTER_USER=‘replication‘,MASTER_PASSWORD=‘replication‘,MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;#重置resetreset slave;#启动slavestart slave;#查看slave状态show slave statusG#结果如下mysql> show slave statusG*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.212 Master_User: replication Master_Port: 3306 Connect_Retry: 10 Master_Log_File: mysql-master-002-bin.000001 Read_Master_Log_Pos: 120 Relay_Log_File: mysql-master-001-bin.000004 Relay_Log_Pos: 294Relay_Master_Log_File: mysql-master-002-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: mysql Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 120 Relay_Log_Space: 472 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:Replicate_Ignore_Server_Ids: Master_Server_Id: 2 Master_UUID: 3d3b9f4f-f74f-11e5-9a30-005056b324c4 Master_Info_File: /opt/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 01 row in set (0.00 sec)注意: Slave_IO_Running: Yes Slave_SQL_Running: Yesc.配置slave-001:(指定 change master 为 master-002,表示从master-002 复制到 slave-001) #ssh到 slave-001 服务器 mysql -u root -p #在mysql控制台录入 #这个是在my.cnf中没有使用GTID(MySQL5.6新特性)下的命令CHANGE MASTER TO MASTER_HOST=‘10.0.0.6‘,MASTER_USER=‘replication‘,MASTER_PASSWORD=‘replication‘,MASTER_PORT=3306,MASTER_LOG_FILE=‘mysql-slave-001-bin.000001‘, MASTER_LOG_POS=260,MASTER_CONNECT_RETRY=10; # 这个是在my.cnf中使用GTID(MySQL5.6新特性)下的命令 CHANGE MASTER TO MASTER_HOST=‘10.0.0.6‘,MASTER_USER=‘replication‘,MASTER_PASSWORD=‘replication‘,MASTER_PORT=3306,MASTER_AUTO_POSITION = 1; #重置reset reset slave; #启动slave start slave; #查看slave状态 show slave statusG #结果如下 mysql> show slave statusGd.配置slave-002(指定 change master 为 master-002,表示从master-002 复制到 slave-002) #ssh到 slave-002 服务器 mysql -u root -p #在mysql控制台录入 #这个是在my.cnf中没有使用GTID(MySQL5.6新特性)下的命令CHANGE MASTER TO MASTER_HOST=‘10.0.0.6‘,MASTER_USER=‘replication‘,MASTER_PASSWORD=‘replication‘,MASTER_PORT=3306,MASTER_LOG_FILE=‘mysql-slave-002-bin.000001‘, MASTER_LOG_POS=260,MASTER_CONNECT_RETRY=10; # 这个是在my.cnf中使用GTID(MySQL5.6新特性)下的命令 CHANGE MASTER TO MASTER_HOST=‘10.0.0.6‘,MASTER_USER=‘replication‘,MASTER_PASSWORD=‘replication‘,MASTER_PORT=3306,MASTER_AUTO_POSITION = 1; #重置reset reset slave; #启动slave start slave; #查看slave状态 show slave statusG #结果如下 mysql> show slave statusG 这样就完成了master-001 和 master-002的相互复制,并且从master-002复制到slave-001 和 slave-002.a.在master-001中建立database ,确认master-002,slave-001 和 slave-002中都同步复制。b.在master-002中建立database ,确认master-001,slave-001 和 slave-002中都同步复制。
2.测试复制机制是否成功。 3.MySQL5.6 GTID新特性实践
http://cenalulu.github.io/mysql/mysql-5-6-gtid-basic/
4.mysql主从复制-CHANGE MASTER TO 语法详解
http://blog.csdn.net/jesseyoung/article/details/41942809

 

七.安装MMM(http://mysql-mmm.org/)1.安装epel扩展包 
CentOS软件仓库默认是不含这些软件的,必须要有epel这个包的支持。故我们必须先安装epelwget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpmrpm -ivh epel-release-7-5.noarch.rpmyum install mysql-mmm-monitoryum install mysql-mmm-agent #用yum安装的 mysql-mmm组件启动的时候会出错。所以用下面的tar.gz文件来安装yum erase mysql-mmm-monitor yum erase mysql-mmm-agent
2.在monitor(10.0.0.20) 上安装监控程序
· cd /tmpwget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gztar -xzvf mysql-mmm-2.2.1.tar.gzcd mysql-mmm-2.2.1.tar.gzmake install 

 

3.在数据库服务器(192.168.1.211-214)上安装代理
cd /tmpwget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gztar -xzvf mysql-mmm-2.2.1.tar.gzcd mysql-mmm-2.2.1.tar.gzmake install

 

4.配置MMM
a.编辑/etc/mysql-mmm/mmm_common.conf 完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,内容如下:active_master_role writer<host default>cluster_interface eth0 #网卡设备pid_path /var/run/mmm_agentd.pidbin_path /usr/lib/mysql-mmm/ #这里要确认是否下面有agent,monitor,tools的目录。否则无法生成vipreplication_user replicationreplication_password replicationagent_user mmm_agentagent_password agent</host><host db1>ip 10.0.0.25mode masterpeer db2</host><host db2>ip 10.0.0.26mode masterpeer db1</host><host db3>ip 10.0.0.28mode slave</host><host db4>ip 10.0.0.29mode slave</host><role writer>hosts db1, db2ips 10.0.0.20mode exclusive</role><role reader>hosts db2, db3, db4ips 10.0.0.25, 10.0.0.26, 10.0.0.28mode balanced</role>通过scp命令分别复制到monitor-001、master-001、master-002、slave-001和slave-002共五台机器上。b. 编辑 4台mysql节点机上的/etc/mysql-mmm/mmm_agent.conf 在数据库服务器上,还有一个mmm_agent.conf需要修改,其内容是:include mmm_common.conf# The ‘this‘ variable refers to this server. Proper operation requires# that ‘this‘ server (db1 by default), as well as all other servers, have the # proper IP addresses set in mmm_common.conf.this db1最后一行的db1,在不同的数据库服务器上要分别改为db2、db3和db4,否则代理就会无法启动。c. 编辑 monitor主机上的/etc/mysql-mmm/mmm_mon.conf 在monitor-001上配置mmm_mon.confinclude mmm_common.conf<monitor>ip 127.0.0.1 #为了安全性,设置只在本机监听,mmm_mond 默认监听9988 pid_path /var/run/mmm_mond.pidbin_path /usr/lib/mysql-mmm/status_path /var/lib/misc/mmm_mond.statusping_ips 10.0.0.5, 10.0.0.6, 10.0.0.8, 10.0.0.9 #用于测试网络可用性 IP 地址列表,只要其中有一个地址 ping 通,就代表网络正常,这里不要写入本机地址 #flap_duration 3600 #抖动的时间范围,单位秒,这两个参数考虑情况添加 # flap_count 3 #在抖动的时间范围内,最大的抖动次数 auto_set_online 60#是否设置自动上线,如果该值大于0,抖动的主机在抖动的时间范围过后,则设置自动上线# The kill_host_bin does not exist by default, though the monitor will# throw a warning about it missing. See the section 5.10 "Kill Host</monitor><check default>check_period 5trap_period 10timeout 2#restart_after 10000max_backlog 86400</check><host default>monitor_user mmm_monitormonitor_password monitor</host> 
5.自动启动agent 和 monitor
a. 在monitor上启动monitor systemctl enable mysql-mmm-monitorsystemctl start mysql-mmm-monitorb. 在4个数据库服务器上启动agentsystemctl enable mysql-mmm-agentsystemctl start mysql-mmm-agent如果出现Starting MMM Monitor daemon: Can‘t locate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_mond line 11[root@monitor ~]# yum install cpan[root@monitor ~]# cpan Proc::Daemon[root@monitor ~]# cpan Log::Log4perlyum install –y perl-*yum install -y libart_lgpl.x86_64yum install -y mysql-mmm.noarch failyum install -y rrdtool.x86_64 yum install -y rrdtool-perl.x86_64[root@monitor mysql-mmm-2.2.1]# /etc/init.d/mysql-mmm-agent startDaemon bin: ‘/usr/sbin/mmm_agentd‘Daemon pid: ‘/var/run/mmm_agentd.pid‘Starting MMM Agent daemon... Ok如果出现Configuration file /etc/mysql-mmm/mmm_common.conf is world readable!这种错误,需要查看/etc/mysql-mmm/mmm_common.conf文件的权限,应该是 chmod 640 /etc/mysql-mmm/mmm_common.conf 集群中所有配置文件的权限最好都设置为640,否则启动 MMM 服务的时候可能出错

 

八. 测试集群

MMM启动顺序:先启动monitor,再启动 agent

mmm_control show# Warning: agent on host db1 is not reachable db1(10.0.0.25) master/AWAITING_RECOVERY. Roles: db2(10.0.0.26) master/ONLINE. Roles: reader(10.0.0.26), writer(10.0.0.20) db3(10.0.0.28) slave/ONLINE. Roles: reader(10.0.0.28) db4(10.0.0.29) slave/ONLINE. Roles: reader(10.0.0.25) 

 

九. 问题和解决办法1.无法分配vip
在monitor主机上使用 systemctl start mysql-mmm-monitor 无法分配vip。而通过/etc/init.d/mysql-mmm-monitor start则可以分配vip 解决办法 http://blog.csdn.net/remote_roamer/article/details/49869395 由于缺少环境变量,导致无法激活vip。 那么就在 /etc/rc.d/init.d/mysql-mmm-monitor的脚本文件里面最上面,加入 source /root/.bash_profile

 

2.vip漂移后,无法ping通10.0.0.20
问题描述: 当master-001发生故障,导致DB不可用时,VIP会自动漂移到master-002上,以实现高可用。但出现了一个问题,由于ARP老化时间过长,导致漂移过去的VIP不可用,也无法ping通。也就是说,MySQL-MMM没有考虑到ARP老化时间过长的情况而采取强刷ARP的方式。a.解决办法1同时修改master-001 和 master-002上的代码(这个没测试成功) 修改文件 /usr/share/perl5/vendor_perl/MMM/Agent/Helpers/Actions.pmvim /usr/share/perl5/vendor_perl/MMM/Agent/Helpers/Actions.pm在sub configure_ip($$)代码段里面的_exit_ok();前面加入以下代码#这里是解决vip偏移后,无法ping通。原因是arp 老化时间过长,这里强制刷新arpmy $getway = `/sbin/route | awk ‘default/ (print $2)‘``/sbin/arping -I $if -c 3 -s $ip $getway `;#配置结束 b.解决办法2 在vip漂移到的主机上手工重置arpingarping -I eno16777984 -c 3 -s 10.0.0.20 10.0.0.1c.解决办法3 在master-001 和 master-002 上使用shell脚本来刷新(这个方法正常运行)vim /root/refresh_vip.sh#增加如下内容:#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbinMMM_COMM_CONF="/etc/mysql-mmm/mmm_common.conf"ETH_NAME=`awk ‘/cluster_interface/{print $2}‘ ${MMM_COMM_CONF}`VIP_ADDR=`grep -A 2 ‘<role writer>‘ ${MMM_COMM_CONF} | awk ‘/ips/{print $2}‘`GETWAY_ADDR=`/sbin/route | awk ‘/default/ {print $2}‘` if [[ -n `/sbin/ip addr show ${ETH_NAME} | grep ${VIP_ADDR}` ]]; then /sbin/arping -I ${ETH_NAME} -c 3 -s ${VIP_ADDR} ${GETWAY_ADDR} >/dev/null 2>&1fi

 

十.放入crontab中运行
crontab -e* * * * * sleep 10; /root/refresh_vip.sh >/dev/null 2>&1* * * * * sleep 20; /root/refresh_vip.sh >/dev/null 2>&1* * * * * sleep 30; /root/refresh_vip.sh >/dev/null 2>&1* * * * * sleep 40; /root/refresh_vip.sh >/dev/null 2>&1* * * * * sleep 50; /root/refresh_vip.sh >/dev/null 2>&1

 

 

MySQL -MMM 学习整理

标签:center   mode   最大的   记录   timezone   position   inux   lld   info   

小编还为您整理了以下内容,可能对您也有帮助:

零基础如何mysql学习?

简单谈谈对新手学习 MySQL 的一些建议,供参考。

一、搭建好环境,弄清基础概念

学习 MySQL ,首先要有个自己的环境,可以在自己本机或某台虚拟机上安装下 MySQL ,建议最好使用 Linux 系统,体验下完整的安装步骤,尽量理解清楚每个步骤的作用。

接下来,要弄清一些基础概念了,比如什么是库、表、字段、索引啊等等。简单介绍下一些常见的基础概念:

实例(instance):指的是操作系统上的一组进程/线程和内存的集合。比如我们在本机安装好 MySQL ,那就代表着我们本地有一套 MySQL 实例。

数据库(database):指的是文件系统上的一组文件,等同于 schema 。

表(table):表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。

字段(column):字段是指数据表的列,表由字段组成。

索引(index):索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

主键(primary key):主键是唯一的。一个数据表中只能包含一个主键。

记录(record):指数据,一行可称为一条记录。

服务端(server):指 MySQL 服务所在端,一般可理解为 MySQL 所在主机。

客户端(client):连接数据库部分,比如 Navicat、jdbc 程序都可称为客户端。

数据类型(Data Types):又称字段类型,即定义某个字段所能存储的类型,如 int 、varchar 等。

字符集(character set):字符是各种文字和符号的总称,字符集是多个字符的集合

二、学习基础操作,熟悉命令规范

了解过基础概念后,建议逐步学习一些基础操作,比如如何建库、建表、插入数据、修改数据、删除数据、查询数据等等。这部分主要练习的是 DDL 及 DML 语句。建议一定要按照命令规范来,比如插入数据时指定字段名,建表时指定字符集。

可以使用 MySQL 命令行来执行 SQL ,也可以使用可视化客户端,关键是要明白每步操作的意义及每条 SQL 的作用。

三、了解报错内容,善用搜索引擎

在执行 SQL 或连接数据库过程中,难免会遇到各种报错,这个时候建议先仔细看下是否存在书写及标点错误,关键还是要留意报错内容,根据报错内容大概率就能发现问题所在,比如 Access denied for user xxx 、able 'xxx' doesn't exist ... 有些看到报错内容很明显就可以发现问题,若实在找不到问题,可以复制报错内容到搜索引擎查找下。

四、根据你的岗位,有目的的进行学习

在互联网行业,不同岗位的小伙伴可能都会用到 MySQL ,但不同岗位员工学习 MySQL 的侧重点却不尽相同。例如做数据分析的同学可能平时写查询 SQL 比较多,开发同学更侧重程序逻辑如何与数据库交互,DBA 同学可能侧重在数据库高性能高可用方面。所以建议根据自己的需求,有侧重点的进行学习。

五、要系统、循序渐进的学习

市面上关于 MySQL 的学习资料有很多,建议选取一个系统的资料进行学习,可以是一本书、一个网站等。切记不要这个资料看一点又转向另外一些资料。

同其他语言学习方法一样,MySQL 学习也要循序渐进,不能说一上来就学习事务、学习 SQL 优化,任何事情都要一步步来。当然最重要的还是坚持,有需求才能推动学习,假如工作中经常用到 MySQL 或者某个项目要使用 MySQL ,那么自然而然的就会慢慢了解 MySQL 。

零基础如何mysql学习?

最近,有很多学员留言让我整理一下“零基础如何mysql学习?”.今天南邵电脑培训就整理一下学习MySQL你需要掌握的知识点以及送给新手学习的建议,希望对大家能够有所帮助!

给新手的学习建议:

1.在学习新的东西的时候,我们至少从三个问题开始。What?why?how?

2.学习需要坚持,如果还没准备好坚持半年比较枯燥的MySQL之旅,那么就别开始。

3.学习东西不在多,在精,市面上有非常多的MySQL教程,不要瞎学,今天这里学一点,明天那里学一点,这样你学的都只是知识点,无法形成一个知识面,知识网络。

4.在学习过程中充满好奇,使用google进行问题搜索,千万不要使用度娘了,质量不高。至于怎么用Google,请自行搜索。

5.学习的目的在于使用,因此,不要仅仅看书,看一遍,看两遍,你可能还是没什么感觉。因此学习一开始,就要动手练习,把资料上的情况,模拟一下。

6.请不要在windows上安装mysql进行学习,因为工作中都是linux系统。我们需要从一开始就是实战,就是生产环境。

7.保持好心态,一步一个脚印的前进。

学习MySQL你需要掌握的知识点:

1.系统,当然windos基本的要会。然后就是Linux系统,现在做MySQLDBA的系统多数都是Linux系统,而生产环境大多又是RedHat,Centos。其他的Linux和Unix系统可以只做了解。

2.Linux基础,网络,IO,内存,磁盘,CPU。包括不限于安装,启动过程,目录结构,远程登录,文件属性与管理,用户与用户权限,LAMP结构vim,yum等shell命令,dns,ftp,以及一些常用工具。

3.MySQL基础:MySQL安装、MySQL体系结构,SQL,MySQL管理维护。

4.数据备份与恢复,常用的引擎:MyISAM、Innodb、NDB等。

5.数据库设计优化,一个好的MySQL系统,往往从设计开始。

6.SQL优化,参数优化,监控,安全等。

7.MySQL负载均衡,读写分离,MHA,MMM高可用架构,以及分布式架构:mycat、maxscale、galeracluster、MySQLGroupReplication等。

8.mysql5.6,mysql5.7新特性,mariadb、percona分支的差异和特点。

9.MySQLJSON、MySQLmemcached。

10.常见MySQL搭配的缓存系统,redis,memcached,以及NOSQL、NEWSQL。

以上,就是小编为大家整理的mysql学习你需要掌握的知识点以及送给新手学习的建议,希望能够帮助到大家!

如何更好地学习Mysql数据库

UPDATE worker_view4 SET name='hi';

ERROR............The target table worker_view4 of the UPDATE is not updatable.

(4)视图中的SELECT中包含子查询。

CREATE VIEW worker_view5(name)

AS SELECT (SELECT name FROM worker);

UPDATE worker_view5 SET name = '刘佳';

该视图中包含了子查询,因此也是不能更新的。

(5)由不可更新的视图导出的视图。

CREATE VIEW worker_view6

AS SELECT * FROM worker_view5;

UPDATE worker_view6 SET name = '王仔';

因为worker_view6是不可更新的视图,所以worker_view6也不可以更新的视图。使用UPDATE语句更新时,会出现系统报错。

(6)创建视图时,ALGORITHM为TEMPTABLE类型。

CREATE ALGORITHM=TEMPTABLE

VIEW worker_view7

AS SELECT * FROM worker;

UPDATE worker_view7 SET name = '王仔';

因为该视图ALGORITHM为TEMPTABLE类型,所以worker_view7不可以更新的视图。TEMPTABLE类型就是临时表类型。系统默认临时表是不能更新的。

(7)视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。例如,表中包含的name字段没有默认值,但是视图中不包含该字段。那么这个视图是不能更新的。因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有NULL值插入。数据库系统是不会允许这样的情况出现的,数据库系统将会阻止这个视图更新。

注意:视图中虽然可以更新数据,但是有很多的。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图来更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的,可能会造成数据更新失败。

除了上述条件不能更新视图以外,WITH[CASCADED|LOCAL]CHECK OPTION也将决定视图能否更新。"LOCAL"参数表示更新视图时要满足该视图本身的定义的条件即可;

8.6 删除视图

删除视图是指删除数据库中已经存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MYSQL中,使用DROP VIEW语句来删除视图,不会删除数据。MySQL中,使用DROP VIEW语句来删除视图。但是,用户必须拥有DROP权限。

DROP VIEW[IF EXISTS] 视图名列表 [RESTRICT|CASCADE]

实例一:

SELECT Drop_priv

FROM mysql.user

WHERE user='root';

CREATE VIEW worker_view_del1

AS SELECT * FROM worker;

CREATE VIEW worker_view_del2

AS SELECT * FROM worker;

CREATE VIEW worker_view_del3

AS SELECT * FROM worker;

DROP VIEW IF EXISTS worker_view_del2, worker_view_del3;

8.7 本章实例

在test数据库中work_info表上进行视图操作。

1. 在test数据库中work_info表

2. 插入记录

3. 创建视图info_view

4. 查看视图info_view的基本结构和详细结构

5. 查看视图info_view的所有记录

6. 修改视图info_view

7. 更新视图

8. 删除视图

work_info表的结构

字段名 字段描述 数据类型 主键 外键 非空 唯一 自增

id 编号 INT(10) 是 否 是 是 否

name 姓名 VARCHAR(20) 否 否 是 否 否

gender 姓别 VARCHAR(4) 否 否 是 否 否

age 年龄 INT(5) 否 否 否 否 否

address 家庭住址 VARCHAR(50) 否 否 否 否 否

tel 电话号码 VARCHAR(20) 否 否 否 否 否

work_info表中的内容

id name gender age address tel

1 张三 M 18 北市市海淀区 01-155151

2 李四 M 22 北京市昌平区 01-215151

3 王五 F 17 湖南省永州市 025-545845

4 赵六 F 25 辽宁省阜新市 0625-514545

(1) 创建work_info表

USE test;

CREATE TABLE IF NOT EXISTS work_info (

id INT(10) NOT NULL UNIQUE PRIMARY KEY,

name VARCHAR(20) NOT NULL,

gender VARCHAR(4) NOT NULL,

age INT(5),

address VARCHAR(50),

tel VARCHAR(20)

) DEFAULT CHARSET=utf8;

(2)向work_info表中插入几条记录。

INSERT INTO work_info VALUES

(1, '张三', 'M', 18, '北市市海淀区','01-155151'),

(2,'李四', 'M', 22, '北京市昌平区', '01-215151'),

(3,'王五','F',17,'湖南省永州市','025-545845'),

(4,'赵六','F',25,'辽宁省阜新市','0625-514545');

(3) 创建视图info_view。从work_info表中选出age>20的记录来创建视图。视图的字段包括id、name、gender和address。ALGORITHM设置为MERGE类型。加上WITH LOCAL CHECK OPTION条件。

CREATE ALGORITHM=MERGE

VIEW info_view(id, name, gender, address)

AS SELECT id, name, gender, address

FROM work_info

WHERE age>20

WITH LOCAL CHECK OPTION;

(4)查看视图info_view的基本结构和详细结构。

SHOW CREATE VIEW info_view \G

(5)查看视图info_view的所有记录。

SELECT * FROM info_view;

(6)修改视图info_view,使其显示age<20的信息,其他条件不变。

ALTER ALGORITHM=MERGE

VIEW info_view(id, name, gender, address)

AS SELECT id, name, gender, address

FROM work_info

WHERE age<20

WITH LOCAL CHECK OPTION;

(7)更新视图,将id为3的记录进行更新。设置其gender为M。

UPDATE info_view SET gender='M' WHERE id=3;

(8)删除视图。

DROP VIEW info_view;

8.8 上机实践

题目要求:

(1)在数据库example下创建college表。

(2)在college表上创建视图college_view。视图的字段包括student_num、student_name、student_age和department。ALGORITHM设置为UNDEFINED类型。加上WITH LOCAL CHECK OPTION条件。

(3)查看视图college_view的详细结构。

(4)更新视图。向视图中插入三条记录。

(5)修改视图,使其显示专业为"计算机"的信息,其他条件不变。

(6)删除视图college_view。

college表的结构

字段名 字段描述 数据类型 主键 外键 非空 唯一 自增

number 学号 INT(10) 是 否 是 是 否

name 姓名 VARCHAR(20) 否 否 是 否 否

major 专业 VARCHAR(20) 否 否 是 否 否

age 年龄 INT(5) 否 否 否 否 否

college_view表的内容

student_num student_name student_age department

0901 张三 20 外语

0902 李四 22 计算机

0903 王五 19 计算机

USE example;

CREATE TABLE college(

number INT(10) NOT NULL UNIQUE PRIMARY KEY,

name VARCHAR(20) NOT NULL,

major VARCHAR(20) NOT NULL,

age TINYINT(3)

) DEFAULT CHARSET=utf8;

CREATE ALGORITHM=UNDEFINED

VIEW college_view(student_num, student_name, student_age, department)

AS SELECT number, name, age, major

FROM college

WITH LOCAL CHECK OPTION;

SHOW CREATE VIEW college_view \G

INSERT INTO college_view VALUES

(0901, '张三', 20, '外语'),

(0902, '李四', 22, '计算机'),

(0903, '王五', 19, '计算机');

CREATE OR REPLACE ALGORITHM=UNDEFINED

VIEW college_view(student_num, student_name, student_age, department)

AS SELECT number, name, age, major

FROM college

WHERE major='计算机'

WITH LOCAL CHECK OPTION;

mysql基本语句详细教程

mysql基本语句是:

1、选择:“select * from table where”范围。

2、插入:“insert into table(field1,field2) values(value1,value2)”。

3、删除:“delete from table where ”范围。

4、更新:“update table set field1=value1 where ”范围。

5、查找:“select * from table where field1 like ’%value1%’”。

6、排序:“select * from table order by field1,field2 [desc]”。

7、总数:“select count as totalcount from table”。

8、求和:“select sum(field1) as sumvalue from table”。

9、平均:“select avg(field1) as avgvalue from table”。

10、最大:“select max(field1) as maxvalue from table”。

11、最小:“select min(field1) as minvalue from table”等。

mysql基本语句详细教程

mysql基本语句是:

1、选择:“select * from table where”范围。

2、插入:“insert into table(field1,field2) values(value1,value2)”。

3、删除:“delete from table where ”范围。

4、更新:“update table set field1=value1 where ”范围。

5、查找:“select * from table where field1 like ’%value1%’”。

6、排序:“select * from table order by field1,field2 [desc]”。

7、总数:“select count as totalcount from table”。

8、求和:“select sum(field1) as sumvalue from table”。

9、平均:“select avg(field1) as avgvalue from table”。

10、最大:“select max(field1) as maxvalue from table”。

11、最小:“select min(field1) as minvalue from table”等。

MySQL的GIS、GEO入门笔记

探索和学习MySQL中GIS相关功能和特性

这里记录了学习和了解MySQL中GIS特性相关内容的过程。

MySQL官方论坛中GIS的举例

测试数据已经导入成功,下面开始对GIS相关函数和GEOHASH进行了解和体验;

mysql中geometry类型的简单使用
MySQL空间数据类型

经纬度信息存储在geometry格式的字段中,该字段必须非空。

MySQL8.0前按照longitude-latitude的顺序存储位置
MySQL8.0前按照longitude-latitude的顺序存储位置
MySQL8.0前按照longitude-latitude的顺序存储位置

插入数据时候可使用如下语句:

MySQL存储geometry信息的方式采用了25bytes,相比WKB的21bytes,多了4bytes的坐标系表示,组成部分如下:

WTF字符串格式说明
select ST_GeomFromText(WTF格式字符串);


WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。通过WTF字符串生成geometry的方法:

点: POINT(x y)
线: LINESTRING(x1 y1, x2 y2, x3 y3...)
多边形: POLYGON((0 0, 10 0, 10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))
多点集: MULTIPOINT(0 0, 20 20, 60 60) 或 MULTIPOINT((0 0),(5 5),(5 0))
多线集: MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
多多边形集: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
例如两点一线组成的几何集: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

A geometry is syntactically well-formed if it satisfies conditions such as those in this (nonexhaustive) list:

Collections are not empty (except GeometryCollection)

更多内容参见
ST_PointFromText('POINT(X Y)');
ST_LineStringFromText('LINESTRING(0 0,1 1,2 2)');
ST_PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))');
ST_GeomCollFromText();

更多内容参见

参见
Point(x,y)
LineString((x1,y1),(x2,y2)...)
Polygon(LineString(),LineString()....)

参见
ST_AsText()
ST_AsBinary()
ST_AsWKT()

参见
ST_Dimension(geom) :返回geom的维度(-1,0,1,2)
ST_Envelope(geom) :返回geom的最小外接矩形(MBR)
ST_GeometryType(geom) :返回geom的类型
ST_IsEmpty(geom) :该函数并不能真实的判空,当geom为任何有效的几何值时返回0,无效的几何值返回1;
ST_IsSimple(geom) :当geom无任何异常几何点返回1(如自相交和自切线等),否则返回0
ST_SRID(geom) :返回geom的坐标系ID

参见
ST_X(Point) :获取Point的X值
ST_Y(Point) :获取Point的Y值

参见
ST_StartPoint(linestrng) : 线的起点
ST_EndPoint(linestring) :返回线的最后一个点
ST_IsClosed(linestring或multilinestring) :线是否闭合(若为线,则判断起点与终点是否一致;若为线组,则判断组内每个元素是否符合闭合线)
ST_Length(linestring) :返回线的长度,若入参为线集,则返回集合内所有长度的和
ST_NumPoiints(linestring) :返回点的数量;
ST_PointN(linestring,N) :返回第N个点(从1开始)

参见
具体不在一一列举,主要有计算多边形面积、中心点、最小外接圆,最大内接圆等函数,列举几个可能会用到的:


ST_Area(Poly|mPoly) :返回双精度的面积或面积的和
'ST_Centroid(Poly|mPoly)':返回数学上的中心点
ST_ExteriorRing(Poly) :返回外接圆

参见
ST_Buffer说明
不再列举,主要有:ST_Buffer(不懂干啥用),ST_ConvexHull(geom)凸包,ST_Dfference(g1,g2)比较差异,ST_Intersecton(g1,g2)交叉点,ST_SymDifference(g1,g2)对称差分,ST_Union(g1,g2)连接、合并等。

检查geometry Objects之间的空间关系的方法。

参见
计算两个Object之间的空间关系的函数,有两个间距离、相交、不相交,包含、相等、相切、重叠、接触、在内等等空间关系。下面列举几个可能会常用的方法:
ST_Contains(g1,g2) :g1是否完全包含g2
ST_Within(g1,g2) :g1是否包含于g2中
ST_Distance(g1,g2) :返回g1和g2之间的距离,已坐标单位计算的
ST_Equals(g1,g2) :返回g1和g2是否相等

参见
MBRContains(g1,g2) :g1的mbr是否包含g2的mbr
MBRWithin(g1,g2) :g1的mbr是否在g2的mbr内
MBRCoveredBy(g1,g2) :g1的mbr是否被g2的mbr覆盖
MBRCovers(g1,g2) :g1的mbr是否覆盖g2的mbr
MBRDisjoint(g1,g2) :g1的mbr,g2的mbr是否不相交
MBRIntersects(g1,g2) :g1mbr,g2mbr是否相交
MBREqual(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBREquals(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBROverlaps(g1,g2) :g1mbr、g2mbr
其他函数请参看原文

GeoHash介绍
GeoHash Wiki百科

MySQL中自带函数 st_geohash(longtude,latitude,max_length) 或 st_geohash(point, max_length) 即可生成某一点的geohash值。

返回一个geohash字符串中的latitude或longitude

返回一个geohash解析出的point数据

官方文档

通过geometry生成一个GeoJSON Object, select st_asgeojson(geometry,max_length,options);

通过GeoJSON生成GeoMetry对象。
ST_GeomFromGeoJSON(jsonstring, [options [, srid]])


具体使用方法参见官方文档

官方文档
MySQL中提供的方便空间运算的函数们

select ST_Distance_Spher(geomPoint1,geomPoint2 [, radius]);
此方法用于计算两点或多个点之间的地球上的距离(是地球球面距离而不是直线距离),返回单位为米,

select ST_IsValid(ST_GeomFromText('LINESTRING(0 0,1 1)'))
判断入参是否是符合地理位置描述的格式。返回1(符合)或者0(不符);

例如:
返回0:
select st_isvalid(st_geomfromtext('linestring(0 0, -0.00 0, 0.0 0)')
返回1:
select st_isvalid(st_geomfromtext('linestring(0 0,1 1)')

select st_astext(st_makeenvelope(pt1, pt2));
返回两点构成的包络。(此计算是基于笛卡尔坐标系而非球面)

例如:
SELECT ST_AsText ( st_makeenvelope ( st_geomfromtext ( 'point(0 0)' ), st_geomfromtext ( 'point(1 1)' ) ) );
返回结果:
POLYGON((0 0,1 0,1 1,0 1,0 0))

效果说明
JS抽稀算法
select st_simplify(geometry, max_distance);
用道格拉斯-普克算法(抽稀函数)简化geometry,并返回与原格式相同格式的结果。

例如,以下点集拟合为直线,步长0.5:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 0.5 )
返回结果:
LINESTRING(0 0, 0 1, 1 1, 2 3, 3 3)
再如,步长1.0:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 1.0 )
返回结果:
LINESTRING(0 0, 3 3)

SELECT ST_Validate(geometry);
验证geometry是符合正确的地理位置信息格式。例如 Point(0 0) 是合格的; Linestring(0 0) 是非法的; Linestring(0 0, 1 1) 是合格的

了解了上述MySQL中关于集合对象的功能,下面来实践一下

由上面geohash长度-精度对应表可知,前6位表示±610米左右的误差,这里先查询前六位范围之后再用上述方法精确筛选一次即可:

可将上述查询方法封装为MySQL函数方便和简化程序调用.

该方法是运用了内置的几何关系运算函数 ST_Contains 和 ST_MakeEnvelop 来实现的,0.5对应大概500米左右的范围,具体如下;

链接: https://pan.baidu.com/s/1cW-kv6DIgtYMw5I3bNFzKA

提取码: jagn

MySQL的GIS、GEO入门笔记

探索和学习MySQL中GIS相关功能和特性

这里记录了学习和了解MySQL中GIS特性相关内容的过程。

MySQL官方论坛中GIS的举例

测试数据已经导入成功,下面开始对GIS相关函数和GEOHASH进行了解和体验;

mysql中geometry类型的简单使用
MySQL空间数据类型

经纬度信息存储在geometry格式的字段中,该字段必须非空。

MySQL8.0前按照longitude-latitude的顺序存储位置
MySQL8.0前按照longitude-latitude的顺序存储位置
MySQL8.0前按照longitude-latitude的顺序存储位置

插入数据时候可使用如下语句:

MySQL存储geometry信息的方式采用了25bytes,相比WKB的21bytes,多了4bytes的坐标系表示,组成部分如下:

WTF字符串格式说明
select ST_GeomFromText(WTF格式字符串);


WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。通过WTF字符串生成geometry的方法:

点: POINT(x y)
线: LINESTRING(x1 y1, x2 y2, x3 y3...)
多边形: POLYGON((0 0, 10 0, 10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))
多点集: MULTIPOINT(0 0, 20 20, 60 60) 或 MULTIPOINT((0 0),(5 5),(5 0))
多线集: MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
多多边形集: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
例如两点一线组成的几何集: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))

A geometry is syntactically well-formed if it satisfies conditions such as those in this (nonexhaustive) list:

Collections are not empty (except GeometryCollection)

更多内容参见
ST_PointFromText('POINT(X Y)');
ST_LineStringFromText('LINESTRING(0 0,1 1,2 2)');
ST_PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))');
ST_GeomCollFromText();

更多内容参见

参见
Point(x,y)
LineString((x1,y1),(x2,y2)...)
Polygon(LineString(),LineString()....)

参见
ST_AsText()
ST_AsBinary()
ST_AsWKT()

参见
ST_Dimension(geom) :返回geom的维度(-1,0,1,2)
ST_Envelope(geom) :返回geom的最小外接矩形(MBR)
ST_GeometryType(geom) :返回geom的类型
ST_IsEmpty(geom) :该函数并不能真实的判空,当geom为任何有效的几何值时返回0,无效的几何值返回1;
ST_IsSimple(geom) :当geom无任何异常几何点返回1(如自相交和自切线等),否则返回0
ST_SRID(geom) :返回geom的坐标系ID

参见
ST_X(Point) :获取Point的X值
ST_Y(Point) :获取Point的Y值

参见
ST_StartPoint(linestrng) : 线的起点
ST_EndPoint(linestring) :返回线的最后一个点
ST_IsClosed(linestring或multilinestring) :线是否闭合(若为线,则判断起点与终点是否一致;若为线组,则判断组内每个元素是否符合闭合线)
ST_Length(linestring) :返回线的长度,若入参为线集,则返回集合内所有长度的和
ST_NumPoiints(linestring) :返回点的数量;
ST_PointN(linestring,N) :返回第N个点(从1开始)

参见
具体不在一一列举,主要有计算多边形面积、中心点、最小外接圆,最大内接圆等函数,列举几个可能会用到的:


ST_Area(Poly|mPoly) :返回双精度的面积或面积的和
'ST_Centroid(Poly|mPoly)':返回数学上的中心点
ST_ExteriorRing(Poly) :返回外接圆

参见
ST_Buffer说明
不再列举,主要有:ST_Buffer(不懂干啥用),ST_ConvexHull(geom)凸包,ST_Dfference(g1,g2)比较差异,ST_Intersecton(g1,g2)交叉点,ST_SymDifference(g1,g2)对称差分,ST_Union(g1,g2)连接、合并等。

检查geometry Objects之间的空间关系的方法。

参见
计算两个Object之间的空间关系的函数,有两个间距离、相交、不相交,包含、相等、相切、重叠、接触、在内等等空间关系。下面列举几个可能会常用的方法:
ST_Contains(g1,g2) :g1是否完全包含g2
ST_Within(g1,g2) :g1是否包含于g2中
ST_Distance(g1,g2) :返回g1和g2之间的距离,已坐标单位计算的
ST_Equals(g1,g2) :返回g1和g2是否相等

参见
MBRContains(g1,g2) :g1的mbr是否包含g2的mbr
MBRWithin(g1,g2) :g1的mbr是否在g2的mbr内
MBRCoveredBy(g1,g2) :g1的mbr是否被g2的mbr覆盖
MBRCovers(g1,g2) :g1的mbr是否覆盖g2的mbr
MBRDisjoint(g1,g2) :g1的mbr,g2的mbr是否不相交
MBRIntersects(g1,g2) :g1mbr,g2mbr是否相交
MBREqual(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBREquals(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBROverlaps(g1,g2) :g1mbr、g2mbr
其他函数请参看原文

GeoHash介绍
GeoHash Wiki百科

MySQL中自带函数 st_geohash(longtude,latitude,max_length) 或 st_geohash(point, max_length) 即可生成某一点的geohash值。

返回一个geohash字符串中的latitude或longitude

返回一个geohash解析出的point数据

官方文档

通过geometry生成一个GeoJSON Object, select st_asgeojson(geometry,max_length,options);

通过GeoJSON生成GeoMetry对象。
ST_GeomFromGeoJSON(jsonstring, [options [, srid]])


具体使用方法参见官方文档

官方文档
MySQL中提供的方便空间运算的函数们

select ST_Distance_Spher(geomPoint1,geomPoint2 [, radius]);
此方法用于计算两点或多个点之间的地球上的距离(是地球球面距离而不是直线距离),返回单位为米,

select ST_IsValid(ST_GeomFromText('LINESTRING(0 0,1 1)'))
判断入参是否是符合地理位置描述的格式。返回1(符合)或者0(不符);

例如:
返回0:
select st_isvalid(st_geomfromtext('linestring(0 0, -0.00 0, 0.0 0)')
返回1:
select st_isvalid(st_geomfromtext('linestring(0 0,1 1)')

select st_astext(st_makeenvelope(pt1, pt2));
返回两点构成的包络。(此计算是基于笛卡尔坐标系而非球面)

例如:
SELECT ST_AsText ( st_makeenvelope ( st_geomfromtext ( 'point(0 0)' ), st_geomfromtext ( 'point(1 1)' ) ) );
返回结果:
POLYGON((0 0,1 0,1 1,0 1,0 0))

效果说明
JS抽稀算法
select st_simplify(geometry, max_distance);
用道格拉斯-普克算法(抽稀函数)简化geometry,并返回与原格式相同格式的结果。

例如,以下点集拟合为直线,步长0.5:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 0.5 )
返回结果:
LINESTRING(0 0, 0 1, 1 1, 2 3, 3 3)
再如,步长1.0:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 1.0 )
返回结果:
LINESTRING(0 0, 3 3)

SELECT ST_Validate(geometry);
验证geometry是符合正确的地理位置信息格式。例如 Point(0 0) 是合格的; Linestring(0 0) 是非法的; Linestring(0 0, 1 1) 是合格的

了解了上述MySQL中关于集合对象的功能,下面来实践一下

由上面geohash长度-精度对应表可知,前6位表示±610米左右的误差,这里先查询前六位范围之后再用上述方法精确筛选一次即可:

可将上述查询方法封装为MySQL函数方便和简化程序调用.

该方法是运用了内置的几何关系运算函数 ST_Contains 和 ST_MakeEnvelop 来实现的,0.5对应大概500米左右的范围,具体如下;

链接: https://pan.baidu.com/s/1cW-kv6DIgtYMw5I3bNFzKA

提取码: jagn

mysql %_20%什么意思

获取某列含有 _20 的行。

select * from tbl_name where col_name = '%_20%'; #找出col_name列里含有 _20 的行。

mysql bigint(20)中20指的是什么?

mysql bigint(20)中20指的是该字段下能输入的最大数字长度。

括号里的数字叫数据的宽度,不同的数据类型对宽度的处理也不一样:

1、整数类型,这里显示的宽度和数据类型的取值范围是没有任何关系的,显示宽度只是指明Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入,而且能够显示出来。例如上面的udi,显示的宽度是4,但是我向uid中插入100001,也是可以的,保存和显示的都会是100001;如果你不设置宽度,系统将添加默认的宽度tinyint(4),smallint(6),mediumint(9),int(11),bigint(20),这些默认的宽度是跟该类型的取值范围长度相关。

2、字符串类型,字符串类型这个宽度才真的用上了。不管是char还是varchar,宽度都定义了字符串的最大长度;例如上面的 password varchar(20),如果你输入了一个21个字符的密码,那么保存和显示的只会是前20个字符,你将丢失一个字符信息,char同理。由于varchar是变长存储的,所以实际开发中我们一般都把varchar的宽度设为最长255,反正你没用完它也不会浪费空间。

3、浮点和日期等数据类型对数据的宽度没有要求,一般也不设置,默认是0。

显示全文