Mysql索引优化一索引类型索引策略

上一篇已经讲了索引的基本类型,这一篇主要介绍下如何选择更高效的索引类型。 独立的列现在有下面一张学生成绩表 CREATE TABLE `student` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(20) NOT NULL, `last_name` varchar(20) NOT NULL, `created_at` timestamp NOT NULL, `updated_at` timestamp NOT NULL, `score` int(3) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `created_at` (`created_at`) KEY `score` (`score`)) ENGINE=InnoDB DEFAULT CHARSET=utf8现在我们要根据学生成绩查询学生姓名,这是一个很简单的查询。select first_name,last_name from student where score=99;这条sql就使用到了索引score。但是我们通常会看到很多查询不恰当的使用到索引,最后就导致mysql没办法使用到索引。如果查询中的不是独立的,则Mysql不会使用到索引,独立的列是指索引列不能是表达式的一部分,也不能是函数的参数。如select first_name,last_name from student where score+1=100;这个查询是不能使用到索引的。再如:select first_name from student where TO_DAYS(NOW())-TO_DAYS(created_at)>0;也是不能使用到索引的。 前缀索引有时候需要索引的列是很长的字符串,如果直接创建索引会使索引变的很大这样就变的比较慢了。改进方式现在能想到就是前面说到的哈希索引,但是有时候哈希索引是不适合的。这个时候就有了前缀索引:把列开始的部分字符串作为索引,这样可以大大的节约索引空间,从而提高索引效率。但这样也会降低索引的选择性。索引选择性指:不重复的索引值和数据表总数的比值。索引的选择性越高,那么索引的查询效率越高。唯一索引的选择性最高为1,性能也是最好的。对于很长的VARCHAR,TEXT这样的列,如果要作为索引的话,那么必须使用前缀索引。那么怎么选择合适的前缀索引呢。诀窍在于要选择足够长的前缀以保证比较高的索引选择性,同时又不能太长,因为索引越短,索引空间越小。如:一张订单表,要为联系人手机号做前缀索引,这个适合需要分析多少长度的前缀索引,可以查询每个长度的 SELECT COUNT(DISTINCT LEFT(phone,3))/COUNT(*) AS pre3,COUNT(DISTINCT LEFT(phone,4))/COUNT(*) AS pre4,COUNT(DISTINCT LEFT(phone,5))/COUNT(*) AS pre5,COUNT(DISTINCT LEFT(phone,6))/COUNT(*) AS pre6,COUNT(DISTINCT LEFT(phone,7))/COUNT(*) AS pre7,COUNT(DISTINCT LEFT(phone,8))/COUNT(*) AS pre8 FROM orders;+--------+--------+--------+--------+--------+--------+| pre3 | pre4 | pre5 | pre6 | pre7 | pre8 |+--------+--------+--------+--------+--------+--------+| 0.0026 | 0.0216 | 0.1397 | 0.3274 | 0.4533 | 0.4533 |+--------+--------+--------+--------+--------+--------+1 row in set (0.10 sec)可以看到在长度为7的时候,选择性的提升已经很小了。这个时候,我们就可以考虑取7这个值了。当然这里只是一个举例,在实际场景中,手机号的长度完全可以直接作为普通索引的。前缀索引是比较小而且快,但是Mysql不能用前缀索引作为group by 和order by,也不能做覆盖扫描(所以查询必须回表)。 ...

July 15, 2019 · 2 min · jiezi

巨杉数据库Sequoiadb如何使用sql查询嵌套的数据类型

【问题详细描述】 见图select.png中的数据,图中的PageSize属于数组内部的数据,现在只需要将PageSize查询出来。也就是使用sql进行查询嵌套数据的查询。 【检视意见】 1、已经解决的问题单,“解决结果”标记为“已解决” 2、“问题描述”中不要只是简单如图所示,尽量将图片的中问题描述出来 3、“解决方法”中不要简单的如图所示,用文字进行描述,图片中的语句可以 当作示例进行介绍;涉及到官方的文档中的知识点可以将链接贴出来 4、个人需要了解该查询命令为什么这样写,方便以后灵活应用 【解决办法】 1、直接查询 根据图select.png中的数据可以得出查询语句:db.exec("select T.Details.$[0].PageSize from $SNAPSHOT_CL as T where T.Name = "my.my" group by T.Name ")。 查询结果可见图solve1.png。 这里需要注意的是语句当中as别名的使用以及读取数组内数据的操作。 as别名的使用范围:如果查询源不为集合,则本层查询中所有字段均需要引用别名( 除外),例如:select T.a , T.b from (select from foo.bar) as T where T.a < 10 。 详细可见: (1)select的用法:http://doc.sequoiadb.com/cn/S...。 (2)as的用法:http://doc.sequoiadb.com/cn/i...。 数组内数据的读取方式:使用"数组名.$[index]",index为下标。例如T.Details.$[0]就是表示Details数组的第一个元素。 详细可见: (1)数组:http://doc.sequoiadb.com/cn/i...。 (2)$+标识符的使用:http://doc.sequoiadb.com/cn/i...。 2、使用split by 将数组拆分后查询 查询语句:db.exec("select K.Details.PageSize as PageSize from (select * from $SNAPSHOT_CL as T where T.Name = "my.my" split by T.Details) as K ")。 查询结果可见图solve2.png。 使用split by先将数组拆分,然后直接使用"数组名.要查询的字段名"即可查询到相关信息。 详细可见: (1)split by的用法:http://doc.sequoiadb.com/cn/i...。 ...

July 15, 2019 · 1 min · jiezi

踩坑maven中mysqlconnectorjava版本更新后driver名更改的问题

跟着教程做SpringBoot的项目,发现教程导入的mybatis-connector-java没有说明版本,可能是教程发布的时候只有5.x版本于是使用最新的版本毫无问题,然而随着mybatis-connector-java发布了6.x之后,莫名其妙把com.mysql.jdbc.Driver改成了com.mysql.cj.jdbc.Driver总是报数据库连接的问题,以后一定要注意这种问题。maven依赖中最好是指定确定的版本,不然随着依赖包不断更新,容易出这种问题。

July 15, 2019 · 1 min · jiezi

巨杉数据库Sequoiadbsdb-shell命令删除主机下所有catacoorddata节点

【问题详细描述】 1、SAC 界面已存在集群; 2、在 sdb shell 执行命令删除该集群下主机所有的 cata、coord、data 节点,命令如下: CataRG.getNode("host1","11810").stop() CateRG.remove("host1",11810) ... 3、在 SAC 界面上卸载主机,卸载报错: 执行命令:remove host,错误码:-6,failed to remove host, the host has business 详细报错信息见附件“error.png”。 【解决方法】 1.卸载主机失败的原因是在 sdb shell 删除集群节点,SAC 未感知; 2.在 SAC 界面 上点击”分布式存储“-》”存储集群操作“-》”同步配置“后,卸载主机即可成功; 3.已在内网提单,单号:SEQUOIADBMAINSTREAM-4441。

July 15, 2019 · 1 min · jiezi

VueNodeExpressMySql的尝试

前言这是一次很简单的尝试,初衷是使用nodejs替换PHP,搭建一个完整的web项目。 项目逻辑vue开发前端,目前还在dev模式,使用proxy代理和node后端进行通信。node+express构建后端web服务,连接mysql,进行增删改查。 功能实现1.前端通过axios,已经实现了get、post,formdata图片上传的功能。2.后端接收get、post、formdata数据,查询数据库返回数据,保存图片返回图片地址的功能。3.图片存储在指定的文件夹,通过xampp指定了一个静态目录做图片存储的功能。 下一步的开发1.目前只实现了对mysql的select操作,下一步需要实现inset、update、delete操作。2.vue项目目前还是dev模式,需要build项目进入product模式,服务器为xampp。 最后最后一步,所有项目迁移到外网,暂定为阿里云。 codeVue端的图片上传代码:upfile.vue: change(){ let that = this let file = that.$refs.avatar.files[0]; let URL = window.URL || window.webkitURL; let imageURL = URL.createObjectURL(file); that.avatar = imageURL let fd = new FormData() fd.append('file', file) that.$store.dispatch('upfile', { fd: fd, callback: function(res){ that.avatar = that.$store.state.imageURL + res.data console.log(res) } }) }Vue端的vuex代码:store.js: upfile (context, data) { axios.create().post('/upfile', data.fd, { headers: { 'Content-Type': 'multipart/form-data' } }).then(response => { console.log('success') data.callback(response.data) }).catch(res => { console.log('error') data.callback(res) }) },Node端的upfile.js: ...

July 15, 2019 · 2 min · jiezi

硬货Oracle数据库出现问题时这十个脚本帮你快速定位原因

“喂,李总您好!” “小张,快点看看ERP数据库,应用又打不开了!” “好的,马上。” 小张从黑色背包拿出电脑,连上手机热点就开始检查,刚连上数据库,电话铃声又响起来了..... 这样的场景对于Oracle DBA来说太熟悉了,只要应用一出问题,不论何时,不论何地,总是第一个接到电话,严重情况下会是一轮电话轰炸。 新手和专家之间遇到此类问题,首先是心态,新手遇到问题心里慌,不知从何下手,胆小粗心,专家因为经验丰富,往往沉着冷静、运筹帷幄、抽丝剥茧、胆大心细,但是经验这东西就跟吃过的盐、走过的桥一样,必须亲自多做、多学才能获得。而另外一个非常重要的就是诊断思路和辅助脚本,本文讲述各种场景下的通用处理思路,分享用到的一些脚本,帮助大家快速定位问题并解决,减少业务的中断事件,早日成为专家,升职加薪,迎娶... >>>>查看操作系统负载 登上数据库服务器后,第一个就是通过系统命令确认下CPU、内存、I/O是否异常,每个系统的命令不一样,常见的有top、topas、vmstat、iostat。 >>>>查看等待事件 第二步就是连到数据库查看活动的等待事件,这是监控、巡检、诊断数据库最基本的手段,通常81%的问题都可以通过等待事件初步定为原因,它是数据库运行情况最直接的体现,如下脚本是查看每个等待事件的个数、等待时长,并排除了一些常见的IDLE等待事件。 --墨天轮 wait_event col event for a45 SELECT inst_id,EVENT, SUM(DECODE(WAIT_TIME, 0, 0, 1)) "Prev", SUM(DECODE(WAIT_TIME, 0, 1, 0)) "Curr", COUNT(*) "Tot" , sum(SECONDS_IN_WAIT) SECONDS_IN_WAIT FROM GV$SESSION_WAITWHERE event NOT IN ('smon timer','pmon timer','rdbms ipc message','SQL*Net message from client','gcs remote message') AND event NOT LIKE '%idle%' AND event NOT LIKE '%Idle%' AND event NOT LIKE '%Streams AQ%' GROUP BY inst_id,EVENT ORDER BY 1,5 desc;这里就需要掌握一些常见异常等待事件的原因,并形成条件反射,比如library cache lock、read by other session、row cache lock、buffer busy waits、latch:shared pool、gc buffer busy、cursor: pin S on X、direct path read、log file sync、enq: TX - index contention、PX Deq Credit: send blkd、latch free、enq: TX - row lock contention等等,如果异常等待事件的个数和等待时间很长,那么排查原因的入口就在这里。 ...

July 15, 2019 · 3 min · jiezi

基于-MySQL-Binlog-的-Elasticsearch-数据同步实践

一、背景随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的 Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的方式,读取 MySQL 中间表中 UTime 大于上一次读取时间的所有数据,即该段时间内的增量,写入Elasticsearch。 所以,一旦业务逻辑中有相应字段的数据变更,需要同时顾及 MySQL 中间表的变更;如果需要 Elasticsearch 中的数据即时性较高,还需要同时写入 Elasticsearch。 随着业务数据越来越多,MySQL 中间表的数据量越来越大。当需要在 Elasticsearch 的索引中新增 Mapping 字段时,相应的 MySQL 中间表也需要新增列,在数据量庞大的表中,扩展列的耗时是难以忍受的。 而且 Elasticsearch 索引中的 Mapping 字段随着业务发展增多,需要由业务方增加相应的写入 MySQL 中间表方法,这也带来一部分开发成本。 三、方案设计1. 整体思路现有的一些开源数据同步工具,如阿里的 DataX 等,主要是基于查询来获取数据源,这会存在如何确定增量(比如使用utime字段解决等)和轮询频率的问题,而我们一些业务场景对于数据同步的实时性要求比较高。为了解决上述问题,我们提出了一种基于 MySQL Binlog 来进行 MySQL 数据同步到 Elasticsearch 的思路。Binlog 是 MySQL 通过 Replication 协议用来做主从数据同步的数据,所以它有我们需要写入 Elasticsearch 的数据,并符合对数据同步时效性的要求。 使用 Binlog 数据同步 Elasticsearch,业务方就可以专注于业务逻辑对 MySQL 的操作,不用再关心数据向 Elasticsearch 同步的问题,减少了不必要的同步代码,避免了扩展中间表列的长耗时问题。 经过调研后,我们采用开源项目 go-mysql-elasticsearch 实现数据同步,并针对马蜂窝技术栈和实际的业务环境进行了一些定制化开发。 ...

July 15, 2019 · 2 min · jiezi

宜信开源漏洞管理平台『洞察』部署指南

『洞察』是一个集成应用系统资产管理、漏洞全生命周期管理、安全知识库管理三位一体的管理平台。 『洞察』使用了Python语言进行开发,利用Flask框架+MySQL+Docker部署实现。 一、部署和启动mysqldocker pull mysql:5.7.13docker run -d -p 127.0.0.1:6606:3306 \--name open_source_mysqldb \-e MYSQL_ROOT_PASSWORD=root \mysql:5.7.13二、创建数据库和账号权限配置$ mysql -h 127.0.0.1 -P 6606 -u root -pEnter password:rootmysql> CREATE DATABASE IF NOT EXISTS vuldb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;mysql> grant all on vuldb.* to vuluser@'%' identified by 'vulpassword';mysql> flush privileges;mysql> quit三、部署和启动APP1、下载源码$ git clone https://github.com/creditease-sec/insight.git2、修改srcpm/config.py 配置文件1)修改公司邮箱后缀 #公司邮箱后缀限制,只能使用公司邮箱注册账号。CORP_MAIL = '@qq.com'2)修改邮件CC抄送列表 #平台发送的每封邮件的邮件抄送列表,可以设置发送给安全部邮箱列表,可自行修改,也可以保持不变为空 ''' 示例: CC_EMAIL = ['xxx1@creditease.cn', 'xxx2@creditease.cn', ] ''' CC_EMAIL = [ ]3)修改开发模式的邮箱服务器和发件邮箱配置 ...

July 15, 2019 · 2 min · jiezi

MySQL™-参考手册使用MySQL程序

使用MySQL程序本节描述如何使用MySQL程序。 调用MySQL程序要从命令行(即从你的shell或命令提示符)调用MySQL程序,请输入程序名称,后跟需要的任何选项或其他参数,以指导程序执行所需的操作。下面的命令显示了一些示例程序调用,shell>表示命令解释器的提示符,这不是你输入的一部分,你看到的特定提示符取决于你的命令解释器,用于sh、ksh或bash典型的提示符是$,用于csh或tcsh的是%,用于Windows command.com或cmd.exe命令解释器是C:\>。 shell> mysql --user=root testshell> mysqladmin extended-status variablesshell> mysqlshow --helpshell> mysqldump -u root personnel以单个或双破折号(-,--)开头的参数指定程序选项,选项通常指示程序应该与服务器建立的连接类型或影响其操作模式。 非选项参数(没有前导破折号的参数)向程序提供额外的信息,例如,mysql程序将第一个非选项参数解释为数据库名,因此命令mysql --user=root test表明你想使用test数据库。 后面描述单个程序的部分指出程序支持哪些选项,并描述任何额外的非选项参数的含义。 一些选项对于许多程序来说是通用的,其中最常用的选项是--host(或-h)、--user(或-u)和--password(或-p)选项,它们指定连接参数。它们指示MySQL服务器运行的主机,以及MySQL帐户的用户名和密码,所有MySQL客户端程序都理解这些选项,它们使你能够指定要连接到哪个服务器以及要在该服务器上使用的帐户。其他连接选项包括--port(或-P)来指定TCP/IP端口号,以及--socket(或-S)来指定Unix上的Unix socket文件(或Windows上的管道名称)。 你可能会发现有必要使用安装它们的bin目录的路径名来调用MySQL程序,当你试图从bin目录以外的任何目录运行MySQL程序时,如果出现“program not found”错误,很可能就是这种情况。为了更方便地使用MySQL,可以将bin目录的路径名添加到PATH环境变量设置中,这使你能够通过只输入程序名而不是整个路径名来运行程序。例如,如果mysql安装在/usr/local/mysql/bin中,你可以通过调用mysql来运行程序,而不需要调用/usr/local/mysql/bin/mysql。 有关设置PATH变量的说明,请参阅命令解释器的文档,设置环境变量的语法是特定于解释器的,修改PATH设置后,在Windows上打开一个新的控制台窗口或在Unix上再次登录,以便设置生效。 上一篇:MySQL程序概述

July 15, 2019 · 1 min · jiezi

Sequelize手记-一

最近开始接触数据库,现在普遍用的都是Mysql数据库,简单的了解了一下sql语句,没有太深入的学习,然后就开始找相关的ORM框架,然后锁定了Sequelize,个人感觉很强大,搜索了一些文档,但是很让人费解,讲的每一部分都是那么的官方,不太容易理解,记录一下学习路程。本文档以koa+Sequelize进行编码测试。 准备工作在尝试使用Sequelize之前先确认是否安装了Mysql数据库,安装node,这里使用的Mysql 5.6版本。 首先要创建一个项目执行命令如下: mkdir 文件夹名称cd 文件夹名称npm init -y // 直接略过所有问答,全部采用默认答案在开始之前首先要安装相关依赖: // 安装 sequelize koa mysql2npm install --save-dev sequelize koa mysql2注意:这里是mysql2 建立连接创建main.js文件,分别引入koa和sequelize建立与mqsql数据库连接。在实例化Sequelize时需要配置一些参数,第一个接收的参数时数据库的名称,第二个是用户名,第三个是密码,第四项是连接mysql的相关配置。 const Koa = require("koa");const Sequelize = require("sequelize");const app = new Koa();const mysqlConfig ={ host: 'localhost', // 接数据库的主机 port: '3306', // 接数据库的端口 protocol: 'tcp', // 连接数据库使用的协议 dialect: 'mysql', // 使用mysql pool: { max: 5, // 最大连接数量 min: 0, // 最小连接数量 idle: 10000 // 连接空置时间(毫秒),超时后将释放连接 }, retry: { // 设置自动查询时的重试标志 max: 3 // 设置重试次数 }, omitNull: false, // null 是否通过SQL语句查询 timezone: '+08:00' // 解决时差 - 默认存储时间存在8小时误差};const sequelize = new Sequelize('aarontest', 'root', '123456',mysqlConfig );app.listen(3000);通过上述代码就已经与Mysql建立了连接。这个地方没有什么可以讲的,按照上述进行配置就可以了。test数据库不一定要存在不存在也是可以正常建立连接的。配置参数还有很多,这里只说了一些常用的,就不多赘述了。如果觉得上述方法比较麻烦可以通过也提供了其他方法进行连接: ...

July 15, 2019 · 4 min · jiezi

SpringBoot-实战-二十-整合-Redis

微信公众号:一个优秀的废人。如有问题,请后台留言,反正我也不会听。 前言两个月没更新原创了,实在惭愧。没有借口,就是因为自己懒了。最近看了「刻意学习」,这本书谈的是学习与行动的关系,书中提到了「持续行动」 这个概念,意思就是:我们要去实实在在地去做一些事情,而且是每天都做,才能称之为「持续行动」。看完这本书以后,我意识到我必须要做些什么,那就是写作。 Redis 简介Redis 是一个开源的,基于内存的键值数据存储,用作数据库,缓存和消息代理。在实现方面,Key-Value 存储代表 NoSQL 空间中最大和最老的成员之一。Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集。在 spring data redis 的框架,可以很容易地编写,通过提供一个抽象的数据存储使用 Redis 的键值存储的 Spring 应用程序。非关系型数据库,基于内存,存取数据的速度不是关系型数据库所能比拟的redis 是键值对 (key-value) 的数据库数据类型字符串类型 string散列类型 hash列表类型 list集合类型 set有序集合类型 zset其中,因为SpringBoot 约定大于配置的特点,只要我们加入了 spring-data-redis 依赖包并配置 Redis 数据库,SpringBoot 就会帮我们自动配置一个 RedisTemplate ,利用它我们就可以按照以下方式操作对应的数据类型,在下面实战中我将会对这五种数据进行操作。 redisTemplate.opsForValue(); //操作字符串redisTemplate.opsForHash(); //操作hashredisTemplate.opsForList(); //操作listredisTemplate.opsForSet(); //操作setredisTemplate.opsForZSet(); //操作有序set开发环境SpringBoot 2.1.6 RELEASEspring-data-redis 2.1.9 RELEASERedis 3.2IDEAJDK8mysql关于如何安装 Redis 这里不再赘述,请自行搜索引擎搜索解决。 pom 依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency></dependencies>配置文件spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true username: root password: 123456 jpa: hibernate: ddl-auto: update #ddl-auto:设为 create 表示每次都重新建表 show-sql: true redis: host: localhost port: 6379 # Redis数据库索引(默认为0) database: 1 jedis: pool: #连接池最大连接数 max-active: 8 #最小空闲连接 min-idle: 0 #最大阻塞等待时间,负值表示没有限制 max-wait: -1ms #最大空闲连接 max-idle: 8 #连接超时时间(毫秒) timeout: 20ms # 无密码可不写 # password:为什么乱码? /** * 添加字符串 */ @Test public void setString(){ redisTemplate.opsForValue().set(USERKEY,"nasus"); redisTemplate.opsForValue().set(AGEKEY,24); redisTemplate.opsForValue().set(CITYKEY,"清远"); }首先是添加字符串类型的数据。它的运行结果如下: ...

July 14, 2019 · 3 min · jiezi

Mysql数据类型选用

为未来预留足够扩展,alter table很麻烦永远选足够的最小长度整型整型有五个,tinyint smallint mediumint int bigint对应占用1,2,3,4,8字节如果不用负数,后面加unsigned,分别大一倍,为255,6万多,一千多万,四十多亿,四十多亿平方不要指定长度,int(1)和int(99)没区别,其实都是int(11)的效果无符号为int(10)int(0)或int(-1)都会自己修正为int(11)字符串固定长度用char,比varchar省一字节长度非常不固定用varcharchar后面的空格会去掉二进制用binary*大文件是blob和text其他时间只能到秒,5.6.4版本好像到微秒1970年到2038年1月用timestamp四字节其他用datetime,八字节还有year,date等枚举用enum,省空间integer,boolean都是别名而已实数用double或float,需精确要decimal表关联字段最好同类型新版本有json类型

July 13, 2019 · 1 min · jiezi

对比-C-和-Python谈谈指针与引用

花下猫语:本文是学习群内 樱雨楼 小姐姐的投稿。之前已发布过她的一篇作品《当谈论迭代器时,我谈些什么?》,大受好评。本文依然是对比 C++ 与 Python,来探讨编程语言中极其重要的概念。祝大家读有所获,学有所成! 樱雨楼 | 原创作者 豌豆花下猫 | 编辑润色 本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/k0... 0 引言指针(Pointer)是 C、C++ 以及 Java、Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念。 指针对于任何一个编程语言而言都是必须且重要的,虽然 Python 对指针这一概念进行了刻意的模糊与限制,但指针对于 Python 而言依然是一个必须进行深入讨论的话题。 本文基于 C++ 与 Python,讨论了 Python 中与指针及引用相关的一些行为。 1 什么是指针?为什么需要指针?指针有两重含义: (1)指代某种数据类型的指针类型,如整形指针类型、指针指针类型 (2)指代一类存放有内存地址的变量,即指针变量 指针的这两重含义是紧密联系的:作为一种变量,通过指针可以获取某个内存地址,从而为访问此地址上的值做好了准备;作为一种类型,其决定了内存地址的正确偏移长度,其应等于当前类型的单位内存大小。 如果一个指针缺少指针类型,即 void *,则显然,其虽然保存了内存地址,但这仅仅是一个起点地址,指针会因为无法获知从起点向后进行的偏移量,从而拒绝解指针操作;而如果一个指针缺少地址,即 nullptr,则其根本无法读取特定位置的内存。 指针存在的意义主要有以下几点: 承载通过 malloc、new、allocator 等获取的动态内存使得 pass-by-pointer 成为可能pass-by-pointer 的好处包括但不限于: 避免对实参无意义的值拷贝,大幅提高效率使得对某个变量的修改能力不局限于变量自身的作用域使得 swap、移动构造函数、移动赋值运算等操作可以仅针对数据结构内部的指针进行操作,从而避免了对临时对象、移后源等对象的整体内存操作由此可见,与指针相关的各操作对于编程而言都是必须的或十分重要的。 2 C++中的引用在 C++ 中,引用具有与指针相似的性质,但更加隐形与严格。C++ 的引用分为以下两种: 2.1 左值引用左值引用于其初始化阶段绑定到左值,且不存在重新绑定。 左值引用具有与被绑定左值几乎一样的性质,其唯一的区别在于 decltype 声明: int numA = 0, &lrefA = numA; // Binding an lvaluecout << ++lrefA << endl; // Use the lvalue reference as lvalue & rvaluedecltype(lrefA) numB = 1; // Error!左值引用常用于 pass-by-reference: ...

July 12, 2019 · 2 min · jiezi

记一次插入意向锁和NextKey引起的死锁

说明: (1)为方便测试,以下测试均使用test 测试表,其表结构为: Table: testCreate Table: CREATE TABLE `test` ( `id` bigint(20) NOT NULL, `oid` bigint(20) NOT NULL, `status` tinyint(2) DEFAULT '0', PRIMARY KEY (`id`), KEY `idx_oid` (`oid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8(2)以下事物隔离级别均为RR 一、插入意向锁1.1 认识插入意向锁官方介绍: Insert Intention Locks 插入若干数据如下 mysql> select * from test;+----+-----+--------+| id | oid | status |+----+-----+--------+| 1 | 1 | 0 || 2 | 2 | 0 || 5 | 5 | 0 || 10 | 10 | 0 |+----+-----+--------+(1)按时序分别执行两个事物: ...

July 12, 2019 · 6 min · jiezi

MySQL™-参考手册MySQL程序概述

MySQL程序概述MySQL安装中有许多不同的程序,本节将对它们进行简要概述,除了NDB集群程序之外,后面的部分提供了每个程序的更详细描述,每个程序的描述都指示其调用语法及其支持的选项。 大多数MySQL发行版都包含所有这些程序,除了那些特定于平台的程序(例如,服务器启动脚本不用于Windows)。RPM发行版更加专门化,一个RPM用于服务器,另一个RPM用于客户机程序,等等。可能你的发行版不包含所有程序,你需要安装额外的软件包。 每个MySQL程序都有许多不同的选项,大多数程序都提供了--help选项,你可以使用该选项来获得程序不同选项的描述,例如,尝试mysql --help。 通过在命令行或选项文件中指定选项,可以覆盖MySQL程序的默认选项值。 MySQL服务器mysqld是执行MySQL安装中大部分工作的主程序,服务器附带几个相关的脚本,以协助你启动和停止服务器: mysqldSQL守护进程(即MySQL服务器),要使用客户端程序,mysqld必须运行,因为客户端通过连接到服务器来访问数据库。 mysqld_safe服务器启动脚本,mysqld_safe尝试启动mysqld。 mysql.server服务器启动脚本,此脚本用于使用System V风格的运行目录的系统,其中包含针对特定运行级别启动系统服务的脚本,它调用mysqld_safe来启动MySQL服务器。 mysqld_multi服务器启动脚本,可以启动或停止安装在系统上的多个服务器。 在MySQL安装或升级过程中几个程序执行安装操作: comp_err此程序在MySQL构建/安装过程中使用,它从错误源文件编译错误消息文件。 mysql_secure_installation这个程序可以提高MySQL安装的安全性。 mysql_ssl_rsa_setup如果缺少SSL证书和密钥文件以及支持安全连接所需的RSA密钥对文件,该程序将创建这些文件,由mysql_ssl_rsa_setup创建的文件可以用于使用SSL或RSA的安全连接。 mysql_tzinfo_to_sql这个程序使用宿主系统zoneinfo数据库的内容(描述时区的一组文件)加载mysql数据库中的时区表。 mysql_upgrade此程序在MySQL升级操作后使用,它用MySQL新版本中所做的任何更改来更新授权表,并检查表的不兼容性,如果需要,还会修复它们。 连接到MySQL服务器的MySQL客户端程序: mysql命令行工具,用于交互式地输入SQL语句或以批处理模式从文件中执行SQL语句。 mysqladmin执行管理操作的客户端,如创建或删除数据库、重新加载授权表、将表刷新到磁盘并重新打开日志文件,mysqladmin还可以用于从服务器检索版本、进程和状态信息。 mysqlcheck一个表维护客户端,用于检查、修复、分析和优化表。 mysqldump将MySQL数据库转储为SQL、文本或XML文件的客户端。 mysqlimport使用LOAD DATA将文本文件导入各自表的客户端。 mysqlpump将MySQL数据库转储为SQL文件的客户端。 mysqlshMySQL Shell是MySQL服务器的高级客户端和代码编辑器,除了提供类似于mysql的SQL功能之外,mysql Shell还为JavaScript和Python提供脚本功能,并包含用于使用mysql的API。X DevAPI允许你同时处理关系数据和文档数据,AdminAPI使你能够使用InnoDB集群。 mysqlshow显示数据库、表、列和索引信息的客户端。 mysqlslap用于模拟用于MySQL服务器的客户端负载并报告每个阶段的时间的客户端,它的工作原理就像多个客户端访问服务器一样。 MySQL管理和实用程序: innochecksum离线InnoDB离线文件校验和实用程序。 myisam_ftdump在MyISAM表中显示全文索引信息的实用程序。 myisamchk用于描述、检查、优化和修复MyISAM表的实用程序。 myisamlog处理MyISAM日志文件内容的实用程序。 myisampack压缩MyISAM表以生成更小的只读表的实用程序。 mysql_config_editor使你能够将身份验证凭据存储在名为.mylogin.cnf的安全加密登录路径文件中的实用程序。 mysqlbinlog用于从二进制日志中读取语句的实用程序,二进制日志文件中包含的执行语句日志可用于帮助从崩溃中恢复。 mysqldumpslow用于读取和总结慢查询日志内容的实用程序。 MySQL程序开发工具: mysql_config在编译MySQL程序时生成所需的选项值的shell脚本。 my_print_defaults显示选项文件的选项组中存在哪些选项的实用程序。 其他使用程序: lz4_decompress解压使用LZ4压缩创建的mysqlpump输出的实用程序。 perror显示系统或MySQL错误代码含义的实用程序。 zlib_decompress解压使用ZLIB压缩创建的mysqlpump输出的实用程序。 Oracle Corporation还提供了MySQL Workbench GUI工具,用于管理MySQL服务器和数据库,创建、执行和评估查询,并将模式和数据从其他关系数据库管理系统迁移到MySQL,其他GUI工具包括MySQL Notifier和用于Excel的MySQL。 使用MySQL客户端/服务器库与服务器通信的MySQL客户端程序使用以下环境变量。 环境变量含义MYSQL_UNIX_PORT默认Unix socket文件,用于连接到localhostMYSQL_TCP_PORT默认端口号,用于TCP/IP连接MYSQL_PWD默认密码MYSQL_DEBUG调试时的调试跟踪选项TMPDIR创建临时表和文件的目录使用MYSQL_PWD是不安全的。 上一篇:在Apache中使用MySQL

July 12, 2019 · 1 min · jiezi

即时通讯之服务端篇Tigase

摘要配置归档配置

July 12, 2019 · 1 min · jiezi

巨杉数据库SequoiadbMac-os-上安装-SequoiaDB-失败

【问题详细描述】 Mac os 上安装 SequoiaDB 失败。报错 cannot execute binary file。为什么? 【解决方法】 SequoiaDB 不支持 Mac os 操作系统。具体支持的系统,请参考服务器软硬件要求:http://doc.sequoiadb.com/cn/s...

July 12, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb在sdb-shell中如何对文件追加写

【问题描述】 在sdb shell中能否对已有文件进行追加写? 【解决方法】 1、可以使用seek方式对已有的文件偏移到某个位置,使用write从偏移的位置开始写,比如: var file = new File("/opt/text.txt") //打开文件 file.seek(0,'e') //表示当前file指针到文件末尾 file.write("test") //表示从文件末尾开始写入“test” file.close //进行保存; 2、seek(offset,where) ,offset:文件指针以字节为单位的偏移; where:规定开始计算的位置 ,where取值:‘b’、'c'、'e',分别代表Begin Current End; 3、sdb shell中可以使用help方法查看相关用法,比如:new File("/opt/text.txt").help(); 4、更多File的使用,请查看官方文档: http://doc.sequoiadb.com/cn/i...。

July 12, 2019 · 1 min · jiezi

docker初战

虽然已经安装了docker很久了,但在以前都没有认真的去学习使用过,只是大概的了解了一下原理就放下不管了,在本周的项目中,潘老师要求我们使用docker来使用数据库,趁此机会,总算是成功的掌握了docker的基本用法。 什么是dockerDocker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。 总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。 上面的解释引自阮一峰的博客,就我的理解来说docker就是一个特别轻量级的虚拟机,然后以端口映射的方式让本机访问它的应用程序,从而避免在本机进行繁琐的开发环境配置。 docker必知必会下面是使用docker过程中必用的一些命令,放到这里当然不是因为他们容易记,而是为了以后方便查阅。 当然要记住下面这些也不难,通过后面的实战示例再加上一两次自己的熟悉基本就能记住了。 docker help 查看帮助,help应该是所有命令行程序最重要的命令了docker pull 从Docker Hub中拉取或者更新指定镜像。docker run -d 标识是让 docker 容器在后台运行。-p 标识通知 Docker 将容器内部使用的网络端口映射到我们使用的主机上。-it 使用交互模式--name 定义一个容器的名字,如果在执行docker run时没有指定Name,那么deamon会自动生成一个随机数字符串当做UUID。-e 设置环境变量,或者覆盖已存在的环境变量。–link 连接运行的容器例如:docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server:latest 含义:容器的名字为mysql,将容器的3306端口映射到本机的3306端口,mysql数据库的密码为password ,运行的镜像为mysql/mysql-server:latest docker ps  -a 查看已经创建的容器-s 查看已经启动的容器docker start con_name 启动容器名为con_name的容器。docker stop con_name 停止容器名为con_name的容器。docker rm con_name 删除容器名为con_name的容器。docker rmi img_name 删除镜像名为img_name的镜像。docker exec -it con_name bash 以bash启动该容器在docker中使用mysql接下来我将会在docker中新建并启动一个mysql容器,然后以本地访问。 拉取官方镜像docker pull mysql:5.7.21创建一个容器并运行docker run --name mysql -p 3309:3306 -e MYSQL_ROOT_PASSWORD=test -d mysql:5.7.21容器的名字为mysql,将容器的3306端口映射到本机的3309端口,mysql数据库的密码为test ,容器在后台运行,运行的镜像为mysql:5.7.21查看一下容器的运行状态docker ps ...

July 12, 2019 · 1 min · jiezi

如何解决-larave-在-mysql-8-报错-SQLSTATEHY000-2054

如何解决 larave 在 mysql 8 报错 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select from information_schema.tables where table_schema = and table_name作为一个好奇猿,最近新项目中使用了 MySQL 8.0 版本,安装过程都很顺畅,满心期待着周五的时候,结果上线时报了上面的错。原因在于 MySQL 8.0 验证插件做了变动,具体可以参考 https://dev.mysql.com/doc/rel... 具体解决步骤可以参考如下步骤 (让我们手拉手,摸着石头过河): 修改 MySQL 配置文件中的验证插件类型并重启 MySQL [mysqld]default_authentication_plugin= mysql_native_password如果之前已经创建过对应的 user,建议使用如下 SQL 重新创建, 其中 {} 的内容大家可以根据实际情况进行替换 CREATE USER '{user}'@'{localhost}' IDENTIFIED WITH mysql_native_password BY '{password}'; 最后推荐有课学微信公众号,有课学是一站式的课程返现 + 好课推荐平台。希望大家都能【学好课,有课学,学有所获】。

July 12, 2019 · 1 min · jiezi

mysql高级使用和技巧

文章来源:www.liangsonghua.me作者介绍:京东资深工程师-梁松华,长期关注稳定性保障、敏捷开发、JAVA高级、微服务架构 一、普通索引和唯一索引查询上来说,普通索引查找到满足条件的记录后会接着查找下一个记录(innodb的数据是按页读写的),判断是否满足。然而唯一索引是查询到了就立即返回了。所以如果你明确知道只有一条结果则应该加上limit 1 更新上来说,普通索引会用到charge buffer优化,将更新操作记录在charge buffer中,不需要从磁盘中读取数据然后再更新,当下次查询该数据页时再读入内存然后执行merge相关操作,更新原数据。 二、前缀索引查询上来说,前缀索引可能会导致在索引树上命中率变高但是原数据命中并不一定高,造成了一定的查询浪费。另外对于索引上的信息足够满足查询条件的情况下,前缀索引会多一次回表操作,整体索引则是直接返回(也就是覆盖索引)。 但是如果提高数据的区分度,比如倒序存储、hash处理后存储等,使用前缀索引存储空间更小,查询次数也不会太差,收益可能会更高。 三、联合索引对于联合索引来说,遵守最左前缀原则,也就是说如果只有idx-union(type,time,value)联合索引,单纯的type或者type and time作来查询条件也会命中这条索引,但是单纯value作为查询条件则无法命中。另外如果存在范围查询比如between等也会导致无法命中 四、收缩表空间当需要收缩表空间时,如果只是delete数据,表文件大小是不变的,会被mysql标记为可复用的空间,需要通过alter重建表才能释放。当然如果是要删除全部数据的话,首选应该是Truncate操作。 五、count(*)操作InnoDb是索引组织表,主键索引树的叶子节点存的是整行数据,而普通索引树的叶子节点是主键值(需要先查找k索引树得到ID,然后再到ID索引树查找,也就是回表),不管是优化器查询哪个索引树或者不使用索引,都需要将所有数据查出来然后累加返回,所以不推荐在innodb引擎的数据库中频繁执行count(*)操作。 六、显示随机信息如果使用order by rand()实现,则需要在临时表上进行rowid(有主键则是主键没有则是系统生成标识行的rowid)排序操作,整体过程涉及全表扫描然后将数据放到内存临时表再生成sort_buffer排序再从内存临时表中取数据。如果sort_buffer_size无法存储数据,则需要使用磁盘文件进行分块存储然后再归并排序。 正确的方式应该是: mysql> select count(*) into @C from t;set @Y1 = floor(@C * rand());set @Y2 = floor(@C * rand());set @Y3 = floor(@C * rand());select * from t limit @Y1,1; // 在应用代码里面取 Y1、Y2、Y3 值,拼出 SQL 后执行select * from t limit @Y2,1;select * from t limit @Y3,1; 七、where条件上不要使用函数对索引字段做函数操作,可能会破坏索引值的有序性,因为b+树中的同一层兄弟节点是有序的 八、where条件不要使用类型转换当字符串和数字做比较时,会将字符串转换成数字,会触发CAST等函数操作,触发上一条规则 九、数据库用错索引时可以强制force index我们知道Mysql结合扫描行数、是否使用临时表、是否需要排序等综合考虑选择索引,当然就会出现用错索引的情况。平时我们explain sql时显示的预估扫描行数rows是mysql通过数据采样,选择这个索引其中n个数据页,统计这些页面的不同值,得到平均值,然后乘以这个索引的页面数,得到基数,也就是区分度。另外还有如果回表代价过大,也可能会选错索引。 十、join操作join操作的过程是先遍历表t1,然后根据从表t1取中的数据到表t2中查找满足条件的记录,也就是说驱动表是走全表扫描,而被驱动表是走树查找(index nested-loop join)。那么理所当然选择小表(过滤后)作为驱动表效果更好。 ...

July 11, 2019 · 1 min · jiezi

MySQL字符集utf8修改为utf8mb4

对于mysql 5.5 而言,如果不设定字符集,mysql默认的字符集是 latin1 拉丁文字符集; 但随着各种业务的进一步发展,除了各个国家的本身语言字符,经常也会有一些表情符号出现在应用程序中,而在mysql 5.5 之前,UTF-8编码只支持1-3个字节,支持BMP这部分的Unicode编码区;从MySQL 5.5开始,可以支持4个字节UTF编码 utf8mb4 ,一个字符能够支持更多的字符集,也能够支持更多表情符号。 utf8mb4兼容utf8,且比utf8能表示更多的字符,是utf8字符集的超集。所以现在一些新的业务,比如ISO等,会将MySQL数据库的字符集设置为utf8mb4。今天在处理一个应用需求的时候,就遇到这样一个问题: 当然调整的最好方法是客户端,mysql数据库的字符集都修改为utf8mb4,但这样修改量比较大,而且如果客户端一部分修改为utf8,一部分为utf8mb4的话,容易发生混乱。 经过几次测试后,MySQL数据库的my.cnf中关于字符集的配置修改为下面的配置了: [client] default-character-set=utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' skip-character-set-client-handshake = true [mysql] default-character-set = utf8mb4

July 11, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb如何人工选择复制组的主节点

【问题详细描述】 如何人工选择复制组的主节点? 【解决方法】 复制组中,每个节点都可以设置选举权重。在 LSN 相同时,权重最大的节点会成为主节点。因此可以通过数据库配置 weight,然后调用 SdbReplicaGroup.reelect() 接口,实现对主节点的人工选择。SdbReplicaGroup.reelect() 接口会阻塞写操作,并等待节点 LSN 一致再进行选举,如果超时,则会失败报错。如,v3.0 上 group1 有节点 sdbserver:11720(主) 和 sdbserver:11750(备)。切主参考步骤如下:var db = new Sdb(); db.updateConf({ weight: 20 }, { GroupName: "group1", Svcname: "11750" }); db.snapshot(SDB_SNAP_CONFIGS, { NodeName: "sdbserver1:11720" }, { weight: 1 }); {"weight": 10 } db.snapshot(SDB_SNAP_CONFIGS, { NodeName: "sdbserver1:11750" }, { weight: 1 }); {"weight": 20 } db.getRG('group1').reelect(); 完成后,查看主节点,已切换。【参考资料】 数据库配置:http://doc.sequoiadb.com/cn/s... SdbReplicaGroup.reelect():http://doc.sequoiadb.com/cn/s...

July 11, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb如何在做完子查询后将子查询结果作为条件下压到-SequoiaDB

【问题详细描述】 有以下 sql 语句。SQL1 耗时约 4s,SQL2、SQL3 耗时约 1 个小时。有办法通过优化 SQL2 做到做完子查询再把所有条件一起下压到 SequoiaDB 吗? 表:ibs.pb_log, 数据量:600亿 ,索引:log_cstno + log_datetime 表:ibs.pb_cstinf_pro,数据量:4千万, 索引:cip_ctfno SQL1: SELECT * FROM ibs.pb_log WHERE log_cstno IN ('2339139') AND log_datetime BETWEEN CONCAT('20190101', '000000') AND CONCAT('20190429', '000000') SQL2: SELECT * FROM ibs.pb_log WHERE log_cstno IN (SELECT cip_cstno FROM ibs.pb_cstinf_pro WHERE cip_ctfno IN ('360426198807174073')) AND log_datetime BETWEEN CONCAT('20190101', '000000') AND CONCAT('20190429', '000000') SQL3: SELECT * FROM ibs.pb_log LEFT JOIN ibs.pb_cstinf_pro ON log_cstno=cip_cstno WHERE log_datetime BETWEEN CONCAT('20190101', '000000') AND CONCAT('20190429', '000000') AND cip_ctfno IN ('360426198807174073') ...

July 11, 2019 · 1 min · jiezi

MySQL™-参考手册常见查询的示例

常见查询的示例以下是如何解决MySQL的一些常见问题的示例。 一些示例使用shop表为某些商人(经销商)保留每件商品的价格(商品编号),假设每个商人的每件商品只有一个固定价格,那么(article、dealer)是记录的主键。 启动命令行工具mysql并选择一个数据库: shell> mysql your-database-name要创建和填充示例表,请使用以下语句: CREATE TABLE shop ( article INT UNSIGNED DEFAULT '0000' NOT NULL, dealer CHAR(20) DEFAULT '' NOT NULL, price DECIMAL(16,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY(article, dealer));INSERT INTO shop VALUES (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45), (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);发出语句后,该表应具有以下内容: SELECT * FROM shop ORDER BY article;+---------+--------+-------+| article | dealer | price |+---------+--------+-------+| 1 | A | 3.45 || 1 | B | 3.99 || 2 | A | 10.99 || 3 | B | 1.45 || 3 | C | 1.69 || 3 | D | 1.25 || 4 | D | 19.95 |+---------+--------+-------+列的最大值“最高的商品编号是多少?” ...

July 10, 2019 · 5 min · jiezi

让办公管理如影随形的移动OA系统

移动改变了人类的生活模式,而移动OA系统引领掌上办公,让企业管理畅通无阻、如影随形。4G网络和智能移动的清新以及超想象力汇入枯燥无趣的PC时代,一度加快了移动OA系统的成长步伐。移动OA系统彻底改变传统的桌面办公模式,让你随时随地掌上办公。 各大OA厂商敏锐把握移动互联大好时机,重新定位,全面启动移动OA研发计划。现在就以天生创想的移动OA系统为例,解析一下移动OA系统是如何提高企业管理水平的。 1、不只是迁徙传统OA 天生创想的移动OA办公系统将移动通信元素与协同办公系统有机结合,配备了常用日常办公功能30多项,包括流程审批、公文管理、集团审批、任务、日志、计划、会议、消息、通知公告等。 从产品特性上看,移动OA系统更具有随时随地办公的管理理念。天生创想移动OA系统支持Windows、Linux操作系统,并结合移动设备的特色,如:移动流程审批,可进行对报批、费用、合同、采购、行政等流程审批的发起与处理,实现无纸化流程管控。工作流程轨迹清晰可查,流程反馈随时通知。 事实上,天生创想的移动OA办公系统并不是传统OA办公系统的衍生物,也不是手机的附属品,而是与智能手机深度融合的,专为移动办公创造的新系统。 2、让管理更进一竿 移动OA系统的核心意旨就是在时间和空间上解放员工,快速提升企业集团管理水平,提高企业核心竞争力,合理规划利用时间,把空间消耗成本降到最低,充分发挥员工的主观能动性。 天生创想的移动OA办公系统在新一代智能移动OA软件领域开辟了一道新路线,同时也将人们从桌面办公的方式解放出来,拓展了办公空间,使员工处理公务时不再受到时间和地点的限制,既提高了办公效率,又减少了办公成本。 站在客户角度考量客户所需,提升企业集团竞争力、执行力,是各大OA厂商需要努力的方向。眼下移动互联深入人心,相信在各大OA厂商的协作努力下,将来的移动OA系统必定能帮助企业管理更进一竿。 天生创想OA软件!专业oa办公软件开源服务提供商,采用php+mysql开源语言,一直致力于应用管理软件基层研发,现己推出企业、集团、saas等应用平台!而且,天生创想oa企业运营管理平台还能通过增减功能模块,让购买系统的价格进行调整,来满足不同企业的办公需求。

July 10, 2019 · 1 min · jiezi

MySQL主从复制什么原因会造成不一致如何预防及解决

来源知数堂《叶问》第1期一、MySQL主从复制什么原因会造成不一致,如何预防及解决?一、导致主从不一致的原因主要有:1、人为原因导致从库与主库数据不一致(从库写入)2、主从复制过程中,主库异常宕机3、设置了ignore/do/rewrite等replication等规则4、binlog非row格式5、异步复制本身不保证,半同步存在提交读的问题,增强半同步起来比较完美。 但对于异常重启(Replication Crash Safe),从库写数据(GTID)的防范,还需要策略来保证。6、从库中断很久,binlog应用不连续,监控并及时修复主从7、从库启用了诸如存储过程,从库禁用存储过程等8、数据库大小版本/分支版本导致数据不一致?,主从版本统一9、备份的时候没有指定参数 例如mysqldump --master-data=2 等10、主从sql_mode 不一致11、一主二从环境,二从的server id一致12、MySQL自增列 主从不一致13、主从信息保存在文件里面,文件本身的刷新是非事务的,导致从库重启后开始执行点大于实际执行点14、采用5.6的after_commit方式半同步,主库当机可能会引起主从不一致,要看binlog是否传到了从库15、启用增强半同步了(5.7的after_sync方式),但是从库延迟超时自动切换成异步复制 二、预防和解决的方案有:1、master:innodb_flush_log_at_trx_commit=1&sync_binlog=12、slave:master_info_repository="TABLE"&relay_log_info_repository="TABLE"&relay_log_recovery=13、设置从库库为只读模式4、可以使用5.7增强半同步避免数据丢失等5、binlog row格式6、必须引定期的数据校验机制7、当使用延迟复制的时候,此时主从数据也是不一致的(计划内),但在切换中,不要把延迟从提升为主库哦~8、mha在主从切换的过程中,因主库系统宕机,可能造成主从不一致(mha本身机制导致这个问题

July 10, 2019 · 1 min · jiezi

使用Docker安装Gitlab及相关配置

最近在学习自动化部署的一些内容,自动化部署,涉及到的内容有Docker、Jenkins、Gitlab等内容,今天通过docker玩了一遍gitlab,下面是一些心得 安装GitlabDocker安装服务实在是太方便,我们通过docker来安装Gitlab,运行如下命令查看Gitlab的镜像文件 搜索镜像 sudo docker search gitlab看到镜像有很多,如果OFFICIAL这一项下面是[OK] 表示为官方的镜像,我这里使用第四个,因为这是中文版的,鄙人英语不好,还是看中文版的比较舒服。其实,中文版也就是安装了一个语言包而已,有兴趣可以自己安装第一个,然后再手动配置中文包 下载镜像 sudo docker pull twang2218/gitlab-ce-zh启动服务 docker run -d -p 8443:443 -p 8090:80 -p 8022:22 --restart always --name gitlab -v /usr/local/gitlab/etc:/etc/gitlab -v /usr/local/gitlab/log:/var/log/gitlab -v /usr/local/gitlab/data:/var/opt/gitlab --privileged=true twang2218/gitlab-ce-zh查看启动情况 // 添加-a 参数,把启动的,没有启动的都列出来sudo docker ps 配置Gitlab配置的时候,我们需要进入容器当中配置,如果直接修改我们映射到容器外部的配置文件,总会出现一些奇怪的问题,为了避免出现问题,尽量按照如下操作流程进行相关的配置和测试 第一步:进入容器 sudo docker exec -it gitlab bash第二步:修改gitlab.rb文件 sudo cd /etc/gitlabsudo vim gitlab.rb第三步:修改IP和端口 该部分内容的修改是为了解决,我们再gitlab创建项目的时候,项目访问地址是容器id的问题 // 可以使用/ 来查找关键字,找到指定的内容,然后通过n来下一个查找// 在gitlab创建项目时候http地址的host(不用添加端口)external_url 'http://xx.xx.xx.xx'// 在gitlab创建项目时候ssh地址的hostgitlab_rails['gitlab_ssh_host'] = 'xx.xx.xx.xx'(不用添加端口)# docker run 的时候我们把22端口映射为外部的8022了,这里修改下gitlab_rails['gitlab_shell_ssh_port'] = 8022第四步:修改邮箱 ...

July 10, 2019 · 1 min · jiezi

宜信开源大数据虚拟混算平台Moonbox配置指南

一、环境准备已安装Apache Spark 2.2.0(此版本仅支持Apache Spark 2.2.0, 其他Spark 版本后续会兼容)已安装MySQL并启动,且开启远程访问各安装节点已经配置ssh免密登录二、下载moonbox-0.3.0-beta下载:https://github.com/edp963/moo... 三、解压tar -zxvf moonbox-assembly_2.11-0.3.0-beta-dist.tar.gz四、修改配置文件配置文件位于conf目录下 step 1: 修改slaves mv slaves.example slaves vim slaves将会看到如下内容: localhost请根据实际情况修改为需要部署worker节点的地址, 每行一个地址 step 2: 修改moonbox-env.sh mv moonbox-env.sh.example moonbox-env.sh chmod u+x moonbox-env.sh vim moonbox-env.sh将会看到如下内容: export JAVA_HOME=path/to/installed/dir export SPARK_HOME=path/to/installed/dir export YARN_CONF_DIR=path/to/yarn/conf/dir export MOONBOX_SSH_OPTS="-p 22" export MOONBOX_HOME=path/to/installed/dir # export MOONBOX_LOCAL_HOSTNAME=localhost export MOONBOX_MASTER_HOST=localhost export MOONBOX_MASTER_PORT=2551请根据实际情况修改 step 3: 修改moonbox-defaults.conf mv moonbox-defaults.conf.example moonbox-defaults.conf vim moonbox-defaults.conf将会看到以下内容,其中: catalog配置元数据存储位置, 必须修改, 请根据实际情况修改 rest配置rest服务, 按需修改 tcp配置tcp(jdbc)服务, 按需修改 ...

July 10, 2019 · 2 min · jiezi

MySQL™-参考手册在Apache中使用MySQL

在Apache中使用MySQL有一些程序允许你从MySQL数据库对用户进行身份验证,也允许你将日志文件写入MySQL表。 你可以通过将以下内容添加到Apache配置文件中来更改Apache日志记录格式,以便MySQL可以轻松读取: LogFormat \ "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\", \ \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""要将该格式的日志文件加载到MySQL中,你可以使用如下语句: LOAD DATA INFILE '/local/access_log' INTO TABLE tbl_nameFIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'应创建指定的表,以使列与LogFormat行写入日志文件的列相对应。

July 10, 2019 · 1 min · jiezi

MySQL™-参考手册在批处理模式下使用mysql

在批处理模式下使用mysql在前面的部分中,你以交互方式使用mysql输入语句并查看结果,你也可以在批处理模式下运行mysql,为此,将要运行的语句放在文件中,然后告诉mysql从文件中读取其输入: shell> mysql < batch-file如果你在Windows下运行mysql并在文件中有一些导致问题的特殊字符,你可以这样做: C:\> mysql -e "source batch-file"如果需要在命令行上指定连接参数,则命令可能如下所示: shell> mysql -h host -u user -p < batch-fileEnter password: ********当你以这种方式使用mysql时,你将创建一个脚本文件,然后执行该脚本。 如果你希望脚本继续运行,即使其中的某些语句产生错误,你应该使用--force命令行选项。 为什么要使用脚本?原因如下: 如果你反复运行查询(例如,每天或每周),使其成为脚本使你可以避免每次执行它时重新输入它。你可以通过复制和编辑脚本文件从现有的查询生成新查询。在开发查询时,批处理模式也很有用,特别是对于多行语句或多语句序列,如果你犯了一个错误,你不必重新输入所有内容,只需编辑脚本以更正错误,然后告诉mysql再次执行它。如果你有一个产生大量输出的查询,你可以通过寻呼机运行输出,而不是看着它从屏幕顶部滚动: shell> mysql < batch-file | more你可以捕获输出到文件中以进行进一步处理: shell> mysql < batch-file > mysql.out你可以将脚本分发给其他人,以便他们也可以运行语句。某些情况不允许交互式使用,例如,当你从cron作业运行查询时,在这种情况下,你必须使用批处理模式。在批处理模式下运行mysql时,默认输出格式与交互使用时的默认输出格式不同(更简洁)。例如,当交互式运行mysql时,SELECT DISTINCT species FROM pet的输出如下所示: +---------+| species |+---------+| bird || cat || dog || hamster || snake |+---------+在批处理模式下,输出看起来像这样: speciesbirdcatdoghamstersnake如果要以批处理模式获取交互式输出格式,请使用mysql -t,要回显输出执行的语句,请使用mysql -v。 你还可以使用source命令或\.命令从mysql提示符中使用脚本: mysql> source filename;mysql> \. filename上一篇:获取有关数据库和表的信息

July 10, 2019 · 1 min · jiezi

巨杉数据库Sequoiadbv26-能不能滚动升级到-v28

【问题详细描述】 v2.6 能不能一台一台地滚动升级到 v2.8?升级的速度跟数据量有关系吗?升级有什么注意事项?【解决方法】 能。版本间能否滚动(在线)升级可以参考版本兼容性列表:http://doc.sequoiadb.com/cn/i...升级速度与数据量关系较小。与机器性能成正比,与集群节点数成反比。注意事项: 1)生产环境在滚动升级时,一般建议暂停写业务,允许读业务。因为在写业务进行时,暂时没有办法保证数据能在升级前完整地备份下来。 2)升级前建议备份数据。在离线的情况下,可以在所有复制组中拷贝一个节点的数据文件到安全的地方。 3)升级步骤必须逐台服务器执行,不能够同时在所有服务器上执行升级数据库版本步骤。【参考资料】 SequoiaDB 版本在线升级介绍说明:http://blog.sequoiadb.com/cn/...

July 10, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb如何查看集合空间所在的域

【问题详细描述】 如何查看集合空间所在的域? 【解决办法】 1.连接编目节点 (如SvcName=11800) var db = new Sdb("localhost",11800); 2.SYSCAT.SYSCOLLECTIONSPACES集合中包含了集群中所有的用户集合空间信息,通过在此集合中指定想要查新的集合空间名即可看到其所属域名。如集合空间名为"foo",可通过以下命令查询: db.SYSCAT.SYSCOLLECTIONSPACES.find({"Name":"foo"}); 【解决办法】 目前 ( v3.2 ) 没有从集合空间反向查找域的接口,可以通过域查找到域中包含的集合空间,即: domain.listCollectionSpaces() 。如需通过集合空间查找其所属域只能直连编目节点后查看系统编目信息,但直连编目节点后不可做修改数据等操作,否则会有风险,所以一般不推荐使用此种方法。如要使用上述方法可参考以下步骤: (1) 连接编目节点 (如SvcName=11800) var db = new Sdb("localhost",11800); (2) SYSCAT.SYSCOLLECTIONSPACES 集合中包含了集群中所有的用户集合空间信息,在此集合中通过指定想要查看的集合空间名进行查询即可在 "Domain" 字段看到其所属域名。如集合空间名为 "foo",可通过以下命令查询: db.SYSCAT.SYSCOLLECTIONSPACES.find({"Name":"foo"});【解决办法】 目前 ( v3.2 ) 没有从集合空间反向查找域的接口,可以通过域查找到域中包含的集合空间,即: domain.listCollectionSpaces() 。如需通过集合空间查找其所属域只能直连编目节点后查看系统编目信息,但直连编目节点后不可做修改数据等操作,否则会有风险,所以一般不推荐使用此种方法。如要使用上述方法可参考以下步骤: (1) 连接编目节点 (如SvcName=11800) var db = new Sdb("localhost",11800); (2) SYSCAT.SYSCOLLECTIONSPACES 集合中包含了集群中所有的用户集合空间信息,在此集合中通过指定想要查看的集合空间名进行查询即可在 "Domain" 字段看到其所属域名。如集合空间名为 "foo",可通过以下命令查询: db.SYSCAT.SYSCOLLECTIONSPACES.find({"Name":"foo"});【参考资料】 SdbDomain.listCollectionSpaces(): http://doc.sequoiadb.com/cn/i... 【解决办法】 可以通过内置SQL的$LIST_CS视图获取,如集合空间名为"cs",执行 db.exec(' select Domain from $LIST_CS where Name="cs" ');即可返回cs的所属域。

July 10, 2019 · 1 min · jiezi

MySQL™-参考手册获取有关数据库和表的信息

获取有关数据库和表的信息如果你忘记了数据库或表的名称,或者给定表的结构是什么(例如,它的列被称为什么),该怎么办?MySQL通过几个语句来解决这个问题,这些语句提供有关它支持的数据库和表的信息。 你之前已经看过SHOW DATABASES,它列出了服务器管理的数据库,要找出当前选择的数据库,请使用DATABASE()函数: mysql> SELECT DATABASE();+------------+| DATABASE() |+------------+| menagerie |+------------+如果尚未选择任何数据库,则结果为NULL。 要找出默认数据库包含的表(例如,当你不确定表的名称时),请使用以下语句: mysql> SHOW TABLES;+---------------------+| Tables_in_menagerie |+---------------------+| event || pet |+---------------------+此语句生成的输出中的列名称始终为Tables_in_db_name,其中db_name是数据库的名称。 如果要了解表的结构,DESCRIBE语句很有用,它显示有关每个表的列的信息: mysql> DESCRIBE pet;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| name | varchar(20) | YES | | NULL | || owner | varchar(20) | YES | | NULL | || species | varchar(20) | YES | | NULL | || sex | char(1) | YES | | NULL | || birth | date | YES | | NULL | || death | date | YES | | NULL | |+---------+-------------+------+-----+---------+-------+Field表示列名称,Type是列的数据类型,NULL表示列是否可以包含NULL值,Key指示该列是否索引,Default指定列的默认值,Extra显示有关列的特殊信息:如果使用AUTO_INCREMENT选项创建列,则该值将为auto_increment而不是空。 ...

July 10, 2019 · 1 min · jiezi

MySQL™-参考手册使用多个表

使用多个表pet表记录你拥有的宠物,如果你想记录关于他们的其他信息,比如他们生活中的事件,比如去看兽医或者当幼崽出生时,需要另一张表,这张表应该是什么样的?它需要包含以下信息: 宠物名称,以便你了解每个事件所属的动物。日期,以便你知道事件发生的时间。描述事件的字段。如果你希望能够对事件进行分类,则有事件类型字段。考虑到这些因素,event表的CREATE TABLE语句可能如下所示: mysql> CREATE TABLE event (name VARCHAR(20), date DATE, type VARCHAR(15), remark VARCHAR(255));与pet表一样,最简单的方法是通过创建包含以下信息的制表符分隔文本文件来加载初始记录。 namedatetyperemarkFluffy1995-05-15litter4 kittens, 3 female, 1 maleBuffy1993-06-23litter5 puppies, 2 female, 3 maleBuffy1994-06-19litter3 puppies, 3 femaleChirpy1999-03-21vetneeded beak straightenedSlim1997-08-03vetbroken ribBowser1991-10-12kennel Fang1991-10-12kennel Fang1998-08-28birthdayGave him a new chew toyClaws1998-03-17birthdayGave him a new flea collarWhistler1998-12-09birthdayFirst birthday像这样加载记录: mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;根据你从pet表上运行的查询中学到的内容,你应该能够对event表中的记录执行检索,原则是一样的,但事件表何时不足以回答你可能会问的问题? 假设你想知道每只宠物生幼仔的年龄,我们前面看到了如何从两个日期计算年龄,母亲的产仔日期在event表中,但要计算她在那个日期的年龄,你需要她的出生日期,它存储在pet表中,这意味着查询需要两个表: mysql> SELECT pet.name, TIMESTAMPDIFF(YEAR,birth,date) AS age, remark FROM pet INNER JOIN event ON pet.name = event.name WHERE event.type = 'litter';+--------+------+-----------------------------+| name | age | remark |+--------+------+-----------------------------+| Fluffy | 2 | 4 kittens, 3 female, 1 male || Buffy | 4 | 5 puppies, 2 female, 3 male || Buffy | 5 | 3 puppies, 3 female |+--------+------+-----------------------------+有关此查询的注意事项有以下几点: ...

July 9, 2019 · 1 min · jiezi

MySQL™-参考手册模式匹配

模式匹配MySQL提供标准的SQL模式匹配以及基于扩展的正则表达式的模式匹配形式,类似于Unix实用程序(如vi、grep和sed)使用的正则表达式。 SQL模式匹配使你可以使用_来匹配任何单个字符,使用%来匹配任意数量的字符(包括零个字符),在MySQL中,SQL模式默认情况下不区分大小写。这里显示了一些例子,使用SQL模式时不要使用=或<>,请改用LIKE或NOT LIKE比较运算符。 要查找以b开头的名称: mysql> SELECT * FROM pet WHERE name LIKE 'b%';+--------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+------------+| Buffy | Harold | dog | f | 1989-05-13 | NULL || Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |+--------+--------+---------+------+------------+------------+要查找以fy结尾的名称: mysql> SELECT * FROM pet WHERE name LIKE '%fy';+--------+--------+---------+------+------------+-------+| name | owner | species | sex | birth | death |+--------+--------+---------+------+------------+-------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL |+--------+--------+---------+------+------------+-------+要查找包含w的名称: ...

July 9, 2019 · 2 min · jiezi

MySQL™-参考手册计数行

计数行数据库通常用于回答“表中某种类型的数据出现频率多少?”的问题。例如,你可能想知道你拥有多少只宠物,或每个拥有者拥有多少只宠物,或者你可能想要对你的动物进行各种类型的普查操作。 计算你拥有的动物总数与“pet表中有多少行?”的问题相同。因为每只宠物有一条记录,COUNT(*)计算行数,因此计算动物的查询如下所示: mysql> SELECT COUNT(*) FROM pet;+----------+| COUNT(*) |+----------+| 9 |+----------+之前,你检索了拥有宠物的人的姓名,如果你想知道每个拥有者有多少宠物,你可以使用COUNT(): mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;+--------+----------+| owner | COUNT(*) |+--------+----------+| Benny | 2 || Diane | 2 || Gwen | 3 || Harold | 2 |+--------+----------+上述查询使用GROUP BY对每个owner的所有记录进行分组,将COUNT()与GROUP BY结合使用在各种分组下描述你的数据非常有用,以下示例显示了执行动物普查操作的不同方法。 每种动物数量: mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;+---------+----------+| species | COUNT(*) |+---------+----------+| bird | 2 || cat | 2 || dog | 3 || hamster | 1 || snake | 1 |+---------+----------+每种性别的动物数量: ...

July 9, 2019 · 2 min · jiezi

MySQL中InnoDB和MyISAM的存储引擎区别

MySQL数据库区别于其他数据库的很重要的一个特点就是其插件式的表存储引擎,其基于表,而不是数据库。由于每个存储引擎都有其特点,因此我们可以针对每一张表来挑选最合适的存储引擎。 作为DBA,我们应该深刻的认识存储引擎。今天介绍两种最常见的存储引擎和它们的区别:InnoDB和MyISAM。 InnoDB存储引擎InnoDB存储引擎支持事务,其设计目标主要就是面向OLTP(On Line Transaction Processing 在线事务处理)的应用。特点为行锁设计、支持外键,并支持非锁定读。从5.5.8版本开始,InnoDB成为了MySQL的默认存储引擎。 InnoDB存储引擎采用聚集索引(clustered)的方式来存储数据,因此每个表都是按照主键的顺序进行存放,如果没有指定主键,InnoDB会为每行自动生成一个6字节的ROWID作为主键。 MyISAM存储引擎MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向OLAP(On Line Analytical Processing 联机分析处理)应用,适用于数据仓库等查询频繁的场景。在5.5.8版本之前,MyISAM是MySQL的默认存储引擎。该引擎代表着对海量数据进行查询和分析的需求。它强调性能,因此在查询的执行速度比InnoDB更快。 MyISAM存储引擎还有一个特点是只缓存索引文件,而不缓存数据文件,这点非常独特。 InnoDB和MyISAM的区别事务为了数据库操作的原子性,我们需要事务。保证一组操作要么都成功,要么都失败,比如转账的功能。我们通常将多条SQL语句放在begin和commit之间,组成一个事务。 InnoDB支持,MyISAM不支持。 主键由于InnoDB的聚集索引,其如果没有指定主键,就会自动生成主键。MyISAM支持没有主键的表存在。 外键为了解决复杂逻辑的依赖,我们需要外键。比如高考成绩的录入,必须归属于某位同学,我们就需要高考成绩数据库里有准考证号的外键。 InnoDB支持,MyISAM不支持。 索引为了优化查询的速度,进行排序和匹配查找,我们需要索引。比如所有人的姓名从a-z首字母进行顺序存储,当我们查找zhangsan或者第44位的时候就可以很快的定位到我们想要的位置进行查找。 InnoDB是聚集索引,数据和主键的聚集索引绑定在一起,通过主键索引效率很高。如果通过其他列的辅助索引来进行查找,需要先查找到聚集索引,再查询到所有数据,需要两次查询。 MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据的指针。 从InnoDB 1.2.x版本,MySQL5.6版本后,两者都支持全文索引。 auto_increment对于自增数的字段,InnoDB要求必须有只有该字段的索引。但MyISAM可以将该字段与其他字段组成联合索引。 表行数很常见的需求是看表中有多少条数据,此时我们需要select count(*) from table_name。 InnoDB不保存表行数,需要进行全表扫描。MyISAM用一个变量保存,直接读取该值,更快。当时当带有where查询的时候,两者一样。 存储数据库的文件都是需要在磁盘中进行存储,当应用需要时再读取到内存中。一般包含数据文件、索引文件。 InnoDB分为: .frm表结构文件.ibdata1共享表空间.ibd表独占空间.redo日志文件MyISAM分为三个文件: .frm存储表定义.MYD存储表数据.MYI存储表索引执行速度如果你的操作是大量的查询操作,如SELECT,使用MyISAM性能会更好。如果大部分是删除和更改的操作,使用InnoDB。 delete调用delete from table时,MyISAM会直接重建表,InnoDB会一行一行的删除,但是可以用truncate table代替。参考: mysql清空表数据的两种方式和区别。 锁MyISAM仅支持表锁,每次操作锁定整张表。InnoDB支持行锁,每次操作锁住最小数量的行数据。 表锁相比于行锁消耗的资源更少,且不会出现死锁,但同时并发性能差。行锁消耗更多的资源,速度较慢,且可能发生死锁,但是因为锁定的粒度小、数据少,并发性能好。如果InnoDB的一条语句无法确定要扫描的范围,也会锁定整张表。 当行锁发生死锁的时候,会计算每个事务影响的行数,然后回滚行数较少的事务。 数据恢复MyISAM崩溃后无法快速的安全恢复。InnoDB有一套完善的恢复机制。 数据缓存MyISAM仅缓存索引数据,通过索引查询数据。InnoDB不仅缓存索引数据,同时缓存数据信息,将数据按页读取到缓存池,按LRU(Latest Rare Use 最近最少使用)算法来进行更新。 如何选择存储引擎创建表的语句都是相同的,只有最后的type来指定存储引擎。 MyISAM大量查询总count查询频繁,插入不频繁没有事务操作InnoDB需要高可用性,或者需要事务表更新频繁参考资料MySQL InnoDB索引原理和算法:https://segmentfault.com/a/11...《MySQL技术内幕 InnoDB存储引擎》 1.3节mysql清空表数据的两种方式和区别:https://segmentfault.com/a/11...Mysql 中 MyISAM 和 InnoDB 的区别有哪些?:https://www.zhihu.com/questio...MySQL存储引擎MyISAM与InnoDB区别总结整理:https://blog.csdn.net/xlgen15...MySQL InnoDB的存储文件:https://blog.csdn.net/chenjia...

July 9, 2019 · 1 min · jiezi

MySQL™-参考手册使用NULL值

使用NULL值在你习惯之前,NULL值可能会令人惊讶,从概念上讲,NULL表示“缺失的未知值”,并且与其他值的处理方式略有不同。 要测试NULL,请使用IS NULL和IS NOT NULL运算符,如下所示: mysql> SELECT 1 IS NULL, 1 IS NOT NULL;+-----------+---------------+| 1 IS NULL | 1 IS NOT NULL |+-----------+---------------+| 0 | 1 |+-----------+---------------+你不能使用算术比较运算符(如=、<或<>)来测试NULL,要自己演示,请尝试以下查询: mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;+----------+-----------+----------+----------+| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |+----------+-----------+----------+----------+| NULL | NULL | NULL | NULL |+----------+-----------+----------+----------+因为与NULL进行任何算术比较的结果也是NULL,所以无法从这种比较中获得任何有意义的结果。 在MySQL中,0或NULL表示false,其他任何表示都是true,布尔运算的默认真值为1。 ...

July 9, 2019 · 1 min · jiezi

MySQL™-参考手册排序行

排序行你可能已在前面的示例中注意到结果行没有按特定顺序显示,当行以某种有意义的方式排序时,通常更容易检查查询输出,要对结果进行排序,请使用ORDER BY子句。 这是动物的生日,按日期排序: mysql> SELECT name, birth FROM pet ORDER BY birth;+----------+------------+| name | birth |+----------+------------+| Buffy | 1989-05-13 || Bowser | 1989-08-31 || Fang | 1990-08-27 || Fluffy | 1993-02-04 || Claws | 1994-03-17 || Slim | 1996-04-29 || Whistler | 1997-12-09 || Chirpy | 1998-09-11 || Puffball | 1999-03-30 |+----------+------------+在字符类型列上,排序与所有其他比较操作一样,通常以不区分大小写的方式执行,这意味着除了大小写不同外,对于相同的列,顺序是未定义的,你可以使用BINARY强制对列进行区分大小写的排序,如下所示:ORDER BY BINARY col_name。 默认排序顺序是升序,首先是最小值,要按反向(降序)排序,请将DESC关键字添加到要排序的列的名称: mysql> SELECT name, birth FROM pet ORDER BY birth DESC;+----------+------------+| name | birth |+----------+------------+| Puffball | 1999-03-30 || Chirpy | 1998-09-11 || Whistler | 1997-12-09 || Slim | 1996-04-29 || Claws | 1994-03-17 || Fluffy | 1993-02-04 || Fang | 1990-08-27 || Bowser | 1989-08-31 || Buffy | 1989-05-13 |+----------+------------+你可以在多个列上进行排序,并且可以在不同列上按不同方向进行排序。例如,要按动物类型按升序排序,然后按动物类型中的出生日期按降序排序(最年轻的动物首先),请使用以下查询: ...

July 9, 2019 · 1 min · jiezi

MySQL™-参考手册日期计算

日期计算MySQL提供了几个可用于在日期上执行计算的函数,例如,计算年龄或提取日期的部分。 要确定每只宠物的年龄,请使用TIMESTAMPDIFF()函数,它的参数是你想要表达结果的单位,以及两个可以取差的日期。以下查询显示了每只宠物的出生日期、当前日期和年龄,别名(age)用于使最终输出列标签更有意义。 mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet;+----------+------------+------------+------+| name | birth | CURDATE() | age |+----------+------------+------------+------+| Fluffy | 1993-02-04 | 2019-07-09 | 26 || Claws | 1994-03-17 | 2019-07-09 | 25 || Buffy | 1989-05-13 | 2019-07-09 | 30 || Fang | 1990-08-27 | 2019-07-09 | 28 || Bowser | 1989-08-31 | 2019-07-09 | 29 || Chirpy | 1998-09-11 | 2019-07-09 | 20 || Whistler | 1997-12-09 | 2019-07-09 | 21 || Slim | 1996-04-29 | 2019-07-09 | 23 || Puffball | 1999-03-30 | 2019-07-09 | 20 |+----------+------------+------------+------+查询有效,但如果以某种顺序显示行,则可以更轻松地扫描结果,这可以通过添加ORDER BY name子句来按名称对输出进行排序来完成: ...

July 9, 2019 · 3 min · jiezi

MySQL™-参考手册从表中检索信息

从表中检索信息SELECT语句用于从表中提取信息,语句的一般形式是: SELECT what_to_selectFROM which_tableWHERE conditions_to_satisfy;what_to_select表示你想要看到的内容,这可以是列列表,或*表示“所有列”。which_table表示要从中检索数据的表,WHERE子句是可选的,如果存在,则conditions_to_satisfy指定行必须满足的一个或多个条件才有资格进行检索。 查询所有数据最简单的SELECT形式从表中检索所有内容: mysql> SELECT * FROM pet;+----------+--------+---------+------+------------+------------+| name | owner | species | sex | birth | death |+----------+--------+---------+------+------------+------------+| Fluffy | Harold | cat | f | 1993-02-04 | NULL || Claws | Gwen | cat | m | 1994-03-17 | NULL || Buffy | Harold | dog | f | 1989-05-13 | NULL || Fang | Benny | dog | m | 1990-08-27 | NULL || Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 || Chirpy | Gwen | bird | f | 1998-09-11 | NULL || Whistler | Gwen | bird | NULL | 1997-12-09 | NULL || Slim | Benny | snake | m | 1996-04-29 | NULL || Puffball | Diane | hamster | f | 1999-03-30 | NULL |+----------+--------+---------+------+------------+------------+如果要查看整个表,例如在刚刚加载初始数据集之后,这种形式的SELECT非常有用。例如,你可能会认为Bowser的出生日期似乎不太合适,咨询你原来的资料,你会发现正确的出生年应该是1989年,而不是1979年。 ...

July 9, 2019 · 3 min · jiezi

OA系统的出现为协同办公开辟了新天地

造纸消耗了大量的自然资源,传统纸质化对于各个机构、事业单位以及集团化企业来说,在使用过程中不仅复杂繁琐,而且极为浪费,自从推行“无纸办公”的方案,减少能源消耗的同时还能节省部分成本和开支,提高办事效率。 实现“无纸办公”也就是办公自动化,而OA办公系统的出现,无疑为“无纸办公”开辟了新的天地。 OA办公系统不仅对企业和单位的经营模式有了更高要求,而且可以使企业和单位能以更高效、更便捷的方式,对企业和单位运营中的工作行为和管理行为提供更好的承载。 同时,OA办公系统能够帮助企业和单位解决各种实际问题,涉及到企业和单位管理的许多方面,如流程审批、公文管理、档案管理、人力资源、CRM系统等,它更强调与其他系统进行集成和整合,目前已经成为企业中不可或缺的信息集成和访问平台。 在激烈的市场竞争中,只有能真正的帮助企业和单位解决问题的产品才能在信息化爆炸的当今社会脱颖而出,获得市场信赖。 天生创想OA软件!专业oa办公软件开源服务提供商,采用php+mysql开源语言,一直致力于应用管理软件基层研发,现己推出企业、集团、saas等应用平台!而且,天生创想oa企业运营管理平台还能通过增减功能模块,让购买系统的价格进行调整,来满足不同企业的办公需求。

July 9, 2019 · 1 min · jiezi

soarPHP-SQL-语句优化器和重写器的-PHP-扩展包-方便框架中-SQL-语句调优

soar-php 是一个基于小米公司开源的 soar 开发的 PHP 扩展包,方便框架中 SQL 语句调优。 项目链接https://github.com/guanguans/soar-phphttps://github.com/guanguans/think-soar框架中使用[x] ThinkPHP[ ] Symfony[ ] Laravel[ ] Lumen[ ] Yii2[ ] Slim环境要求PHP >= 5.6ext-pdoext-json安装$ composer require guanguans/soar-php --dev使用下载 XiaoMi 开源的 SQL 优化器 soar,更多详细安装请参考 soar install# macOS$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.darwin-amd64# linux$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64# windows$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.windows-amd64# 用其他命令或下载器下载均可以初始化配置,更多详细配置请参考 soar config方法一、运行时初始化配置<?phprequire_once __DIR__.'/vendor/autoload.php';use Guanguans\SoarPHP\Soar;$config = [ // 下载的 soar 的路径 '-soar-path' => '/Users/yaozm/Documents/wwwroot/soar-php/soar.darwin-amd64', // 测试环境配置 '-test-dsn' => [ 'host' => '127.0.0.1', 'port' => '3306', 'dbname' => 'database', 'username' => 'root', 'password' => '123456', ], // 日志输出文件 '-log-output' => './soar.log', // 报告输出格式: 默认 markdown [markdown, html, json] '-report-type' => 'html',];$soar = new Soar($config);方法二、配置文件初始化配置vendor 同级目录下新建 .soar.dist 或者 .soar,内容参考 .soar.example,例如: ...

July 9, 2019 · 2 min · jiezi

一文读懂TOGAF企业架构

TOGAF ®,由The Open Group的标准,是一个成熟的企业架构方法和框架由世界领先的组织使用,以提高业务效率。它是最突出和最可靠的企业架构标准,可确保企业架构专业人员之间的一致标准,方法和通信。精通TOGAF标准的企业架构专业人员享有更高的行业信誉,工作效率和职业机会。TOGAF帮助从业者避免陷入专有方法,更有效地利用资源,实现更高的投资回报。 为何选择TOGAF?IT架构需要密切反映组织的业务目标。实际上,应该使用特定的技术(业务场景)来确保IT架构师正确理解业务目标,并反映在使用TOGAF开发的IT架构中。 以下是我们应该采用TOGAF ADM进行架构开发的原因: 一种全面的通用方法与其他框架互补,不与其他框架竞争在市场上广泛采用可以满足组织和行业的需求可免费获得永久许可供应商,工具和技术中立的开放标准避免重新发明轮子业务IT一致性基于最佳实践可以参与框架的演变什么是TOGAF架构开发方法(ADM)?架构开发方法(ADM)用于开发满足组织业务和信息技术需求的企业架构。TOGAF ADM是大量架构从业者为实现以下目的而不断贡献的结果: 它描述了一种开发和管理企业体系结构生命周期的方法,并构成了TOGAF的核心。它可以根据组织的需求进行定制,然后用于管理体系结构规划活动的执行。TOGAF和ArchiMateArchiMate是Open Group引入的建模标准。它提供了一组丰富的建模符号和概念,支持在域内和域之间一致地建模企业架构。 由于TOGAF和ArchiMate都是由Open Group维护的标准,它们都用于企业架构开发,很多人在它们之间感到困惑,提出诸如“TOGAF和ArchiMate之间有什么区别?”,“TOGAF vs ArchiMate?”之类的问题, TOGAF框架和ArchiMate建模语言均由The Open Group维护。TOGAF 9.1和ArchiMate 2.1或更高版本协同工作,是EA开发的兼容和补充。虽然TOGAF ADM是一个可用于开发和实施企业系统,流程和结构的EA框架,但ArchiMate可用作可视建模语言,可用于创建EA描述。 重申ArchiMate标准是建模语言而非框架是很重要的。ArchiMate语言广泛用于开发可视化EA模型,通常与TOGAF ADM一起使用。此外,TOGAF和ArchiMate标准可以组合在一起,提供一组可用于建模不同体系结构的视点。 ArchiMate语言由ArchiMate核心语言组成,其中包括业务,应用程序和技术层,以及构建体系结构的策略和动机以及实现和迁移的元素。 下图显示了ArchiMate语言如何与TOGAF架构开发方法(ADM)阶段相关的简化映射。 ArchiMate核心代码ArchiMate层可以对TOGAF定义的体系结构域进行建模。 该业务,应用和技术层支持业务,信息系统和技术架构领域由TOGAF框架中定义的描述,以及它们的相互关系。 战略与动机延伸战略和动机扩展可以实现利益相关者的建模,变革的驱动因素,业务目标,原则和要求。 ArchiMate语言中的策略和激励元素可用于支持TOGAF ADM 的需求管理,初步和架构愿景阶段,这些阶段建立了高级业务目标,架构原则和初始业务需求。它们也与TOGAF ADM的架构变更管理阶段相关,因为该阶段涉及不断变化的需求。 实施和迁移扩展实施和迁移扩展支持项目组合管理,差距分析以及过渡和迁移规划的建模。 ArchiMate语言的实现和迁移元素通过TOGAF ADM的机会和解决方案,迁移规划和实施治理阶段支持体系结构的实施和迁移。 TOGAF ADM生命周期 - 迭代ADM支持三个级别的迭代概念: 在ADM周围循环:ADM以循环方式呈现,表明一个架构工作的完成直接进入架构工作的后续阶段。 在阶段之间进行迭代:TOGAF描述了跨阶段迭代的概念(例如,在完成技术架构时返回到业务架构)。 围绕单个阶段循环:TOGAF支持在单个ADM阶段内重复执行活动,作为详细描述架构内容的技术。 TOGAF ADM在ADM过程的应用过程中,根据ADM提供的相位目标,根据一些输入和步骤产生许多输出。 例如: 流程架构要求项目计划项目合规评估等等为了以一致和结构化的方式整理和展示这些主要的工作产品,TOGAF定义了一个结构模型,用于放置它们。 ADM输入和输出TOGAF从每个阶段提供了许多输入和输出可交付成果: 这些是建议,不需要完全遵循生成的每个可交付成果应进行版本化以指示何时发生更改显示的版本编号也是一个建议,无需遵循交付合同规定的工作产品,然后由利益相关者正式审查,同意和签署。它通常在项目完成时归档,或者作为参考模型转换为Architecture Repository ADM初步阶段创建体系结构功能所需的准备和启动活动,包括TOGAF的定制和体系结构的定义 输出可交付成果:架构原则架构库业务原则,业务目标和业务驱动因素企业架构的组织模型要求架构工作量身定制的架构框架ADM阶段A:架构愿景架构开发周期的初始阶段。它包括有关定义体系结构开发计划范围,识别利益相关者,创建体系结构愿景以及获得批准以继续体系结构开发的信息 输出可交付成果:架构原则架构路线图架构愿景业务原则,业务目标和业务驱动因素能力评估沟通计划架构工作声明量身定制的架构框架ADM阶段B:业务架构业务架构:开发业务架构以支持商定的架构愿景 输出可交付成果:架构定义文档架构原则架构要求规范架构路线图业务原则,业务目标和业务驱动因素架构工作声明ADM阶段C:信息系统架构信息系统架构:开发信息系统架构以支持商定的架构愿景 架构定义文档架构原则架构要求规范架构路线图架构工作声明ADM阶段D:技术架构技术架构:技术架构的发展,以支持商定的架构愿景 输出可交付成果:架构定义文档架构原则架构要求规范架构路线图架构工作声明ADM阶段E:机遇与解决方案机遇与解决方案为前几个阶段定义的架构进行初步实施计划和交付工具的识别 输出可交付成果:架构定义文档架构要求规范架构路线图架构愿景能力评估实施和迁移计划架构工作声明ADM阶段F:迁移计划迁移规划通过最终确定详细的实施和迁移计划,阐述如何从基准迁移到目标体系结构 架构构建基块架构定义文档架构要求规范架构路线图变更请求实施和迁移计划实施治理计划要求架构工作架构工作声明ADM阶段G:实施治理实施治理提供了对实施的架构监督 输出可交付成果:改变请求合规评估解决方案构建块架构工作声明ADM阶段H:架构变更管理架构变更管理建立了管理新架构变更的程序。需求管理检查整个ADM中管理架构需求的过程 摘要ADM是一种综合的通用方法 它建议了开发体系结构所涉及的各个阶段和步骤的顺序这是一种迭代方法它利用了TOGAF的其他部分来获取资产和流程它可以与其他框架的其他可交付成果一起使用以下是每个开发阶段的TOGAF ADM概述,如下图所示: ...

July 9, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb为什么查看会话快照不显示协调节点中的会话

【问题详细描述】 为什么snapshot(SDB_SNAP_SESSIONS,{Type:"Agent"})无记录返回,但snapshot(SDB_SNAP_SESSIONS,{NodeName:"sdb2:11810","Type":"Agent"})却能返回正常的结果? 【解决办法】 1.快照默认不显示协调节点,会话快照中只显示编目节点和数据节点中的会话,如需查看协调节点的会话需要通过指定命令位置参数的方式才能找到,命令位置参数可以使用{ Global: false }, { Role: 'coord' } 等。 【详情参考】 命令位置参数 http://doc.sequoiadb.com/cn/i...

July 9, 2019 · 1 min · jiezi

巨杉数据库SequoiadbforceSession能否直接终止集群中所有session

【问题描述】 forceSession能否直接停掉集群中所有session? 【解决方法】 1、目前v3.2不能force终止所有session; 2、forceSession的具体使用方法,请参考: http://doc.sequoiadb.com/cn/i...。

July 9, 2019 · 1 min · jiezi

MySQL™-参考手册创建和使用数据库

创建和使用数据库一旦知道如何输入SQL语句,就可以访问数据库了。 假设你家中有几只宠物(你的动物园),并且你希望跟踪有关它们的各种类型的信息。你可以通过创建表来保存数据并使用所需信息加载数据,然后,你可以通过从表中检索数据来回答有关你的动物的各种问题,本节介绍如何执行以下操作: 创建一个数据库创建一个表将数据加载到表中以各种方式从表中检索数据使用多个表动物园数据库很简单(故意),但要想到可能使用类似数据库的真实情况并不困难。例如,农民可以使用这样的数据库跟踪牲畜,或由兽医跟踪患者记录,可以从MySQL网站获得包含以下部分中使用的一些查询和样本数据的动物园发行版,它通过https://dev.mysql.com/doc/以压缩tar文件和Zip格式提供。 使用SHOW语句查找服务器上当前存在的数据库: mysql> SHOW DATABASES;+----------+| Database |+----------+| mysql || test || tmp |+----------+mysql数据库描述了用户访问权限,test数据库通常可用作工作空间供用户试用。 语句显示的数据库列表可能在你的计算机上有所不同,如果你没有SHOW DATABASES权限,SHOW DATABASES不会显示你没有权限的数据库。 如果test数据库存在,请尝试访问它: mysql> USE testDatabase changed与QUIT一样,USE不需要分号(如果你愿意,你可以用分号终止这样的语句,它没有坏处)。USE语句在另一方面也是特殊的:它必须在一行上给出。 对于后面的示例,你可以使用测试数据库(如果你有权访问它),但是你在该数据库中创建的任何内容都可以被其他任何有权访问它的人删除。因此,你可能应该要求MySQL管理员允许使用你自己的数据库,假设你想调用你的menagerie,管理员需要执行如下语句: mysql> GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';其中your_mysql_name是分配给你的MySQL用户名,your_client_host是连接到服务器的主机。 创建和选择数据库如果管理员在设置权限时为你创建数据库,则可以开始使用它,否则,你需要自己创建它: mysql> CREATE DATABASE menagerie;在Unix下,数据库名称区分大小写(与SQL关键字不同),因此你必须始终将数据库作为menagerie引用,而不是Menagerie、MENAGERIE或其他一些变体,表名也是如此。在Windows下,此限制不适用,但你必须在给定查询中使用相同的大小写引用数据库和表,但是,由于各种原因,建议的最佳做法始终是使用创建数据库时使用的相同字母。 如果你尝试创建数据库时收到错误,例如ERROR 1044 (42000): Access denied for user 'micah'@'localhost' to database 'menagerie',这意味着你的用户帐户没有必要的权限。创建数据库不会选择它来使用,你必须明确地这样做,要使menagerie成为当前数据库,请使用以下语句: mysql> USE menagerieDatabase changed你的数据库只需创建一次,但每次开始mysql会话时都必须选择它才能使用,你可以通过发出USE语句来执行此操作,如示例中所示。或者,你可以在调用mysql时在命令行上选择数据库,只需在你可能需要提供的任何连接参数之后指定其名称,例如: shell> mysql -h host -u user -p menagerieEnter password: ********刚刚显示的命令中的menagerie不是你的密码,如果要在-p选项后的命令行上提供密码,则必须在没有中间空间的情况下执行此操作(例如,-ppassword,而不是-p password)。但是,建议不要在命令行中输入密码,因为这样做会让登录到你机器上的其他用户窥探密码。你可以随时使用SELECT DATABASE()查看当前选择的数据库。

July 9, 2019 · 1 min · jiezi

MySQL™-参考手册输入查询

输入查询确保已连接到服务器,如上一节中所述。这样做本身并不会选择任何可以使用的数据库,但这没关系,此时,更重要的是要找到一些关于如何发出查询的信息,而不是直接创建表,将数据加载到它们中以及从中检索数据。本节介绍了输入查询的基本原则,使用你可以尝试的几个查询来熟悉mysql的工作原理。 这是一个简单的查询,要求服务器告诉你它的版本号和当前日期,在mysql>提示符后面输入如下所示,然后按Enter键: mysql> SELECT VERSION(), CURRENT_DATE;+-----------+--------------+| VERSION() | CURRENT_DATE |+-----------+--------------+| 5.8.0-m17 | 2015-12-21 |+-----------+--------------+1 row in set (0.02 sec)mysql>这个查询说明了几个关于mysql的东西: 查询通常由一个SQL语句后跟一个分号组成(有一些例外,可以省略分号,前面提到的QUIT就是其中之一,我们稍后会找到其他)。当你发出查询时,mysql将其发送到服务器执行并显示结果,然后打印另一个mysql>提示符以指示它已准备好进行另一个查询。mysql以表格形式显示查询输出(行和列),第一行包含列的标签,以下行是查询结果。通常,列标签是从数据库表中提取的列的名称,如果要检索表达式的值而不是表列(如刚刚显示的示例中所示),则mysql使用表达式本身标记列。mysql显示返回了多少行以及执行查询所需的时间,这使你可以大致了解服务器性能。这些值不精确,因为它们代表时钟时间(不是CPU或机器时间),并且因为它们受服务器负载和网络延迟等因素的影响。关键字可以输入任何大小写,以下查询是等效的: mysql> SELECT VERSION(), CURRENT_DATE;mysql> select version(), current_date;mysql> SeLeCt vErSiOn(), current_DATE;这是另一个查询,它演示了你可以将mysql用作简单的计算器: mysql> SELECT SIN(PI()/4), (4+1)*5;+------------------+---------+| SIN(PI()/4) | (4+1)*5 |+------------------+---------+| 0.70710678118655 | 25 |+------------------+---------+1 row in set (0.02 sec)到目前为止显示的查询是相对较短的单行语句,你甚至可以在一行中输入多个语句,用分号结尾: mysql> SELECT VERSION(); SELECT NOW();+-----------+| VERSION() |+-----------+| 8.0.13 |+-----------+1 row in set (0.00 sec)+---------------------+| NOW() |+---------------------+| 2018-08-24 00:56:40 |+---------------------+1 row in set (0.00 sec)不需要在一行上给出全部查询,所以需要多行的长查询不是问题。mysql通过查找终止分号来确定语句的结束位置,而不是查找输入行的结尾(换句话说,mysql接受自由格式输入:它收集输入行但在看到分号之前不执行它们)。 ...

July 9, 2019 · 1 min · jiezi

MySQL™-参考手册Perl安装说明

Perl安装说明Perl DBI模块为数据库访问提供通用接口,你可以编写一个DBI脚本,它可以与许多不同的数据库引擎一起工作,而无需更改。要使用DBI,必须为要访问的每种类型的数据库服务器安装DBI模块以及数据库驱动程序(DBD)模块,对于MySQL,此驱动程序是DBD::mysql模块。 MySQL发行版不包含Perl支持,对于Unix你可以从http://search.cpan.org获取必要的模块,或者在Windows上使用ActiveState ppm程序,以下部分描述了如何执行此操作。DBI/DBD接口需要Perl 5.6.0,并且首选5.6.1或更高版本,如果你有旧版本的Perl,则DBI不起作用,你应该使用DBD::mysql 4.009或更高版本,虽然早期版本可用,但它们不支持MySQL 8.0的完整功能。 在Unix上安装PerlMySQL Perl支持要求你已经安装了MySQL客户端编程支持(库和头文件),大多数安装方法都安装了必要的文件。如果从Linux上的RPM文件安装MySQL,请务必同时安装开发人员RPM,客户端程序位于客户端RPM中,但客户端编程支持位于开发人员RPM中。 你可以从http://search.cpan.org上的CPAN(综合Perl存档网络)获取Perl支持所需的文件。 在Unix上安装Perl模块的最简单方法是使用CPAN模块,例如: shell> perl -MCPAN -e shellcpan> install DBIcpan> install DBD::mysqlDBD::mysql安装运行了许多测试,这些测试尝试使用默认用户名和密码连接到本地MySQL服务器,默认用户名是Unix上的登录名,Windows上是ODBC,默认密码为“无密码”。如果无法使用这些值连接到服务器(例如,如果你的帐户有密码),则测试将失败,你可以使用force install DBD::mysql来忽略失败的测试。 DBI需要Data::Dumper模块,它可能已安装,如果没有,你应该在安装DBI之前安装它。 也可以以压缩tar档案的形式下载模块发行版并手动构建模块,例如,要解压缩并构建DBI发行版,请使用以下过程: 将发行包解压缩到当前目录: shell> gunzip < DBI-VERSION.tar.gz | tar xvf -此命令创建名为DBI-VERSION的目录。 将位置更改为解压缩发行包的顶级目录: shell> cd DBI-VERSION构建发新版并编译所有内容: shell> perl Makefile.PLshell> makeshell> make testshell> make installmake test命令很重要,因为它验证模块是否正常工作,请注意,在DBD::mysql安装期间运行该命令以执行接口代码时,MySQL服务器必须正在运行或测试失败。 每当安装新版本的MySQL时,重建并重新安装DBD::mysql发行版是个好主意,这可确保正确安装最新版本的MySQL客户端库。 如果你没有在系统目录中安装Perl模块的访问权限,或者如果要安装本地Perl模块,则以下引用可能有用:http://learn.perl.org/faq/per...。 在Windows上安装ActiveState Perl在Windows上,你应该执行以下操作以使用ActiveState Perl安装MySQL DBD模块: 从http://www.activestate.com/Pr...获取ActiveState Perl并安装它。打开控制台窗口。如有必要,请设置HTTP_proxy变量,例如,你可以尝试这样的设置: C:\> set HTTP_proxy=my.proxy.com:3128启动PPM程序: C:\> C:\perl\bin\ppm.pl如果你之前没有这样做,请安装DBI: ppm> install DBI如果成功,请运行以下命令: ppm> install DBD-mysql此过程应与ActiveState Perl 5.6或更高版本一起使用。 ...

July 8, 2019 · 1 min · jiezi

MySQL™-参考手册连接和断开服务器

连接和断开服务器要连接到服务器,通常需要在调用mysql时提供MySQL用户名,并且很可能需要密码,如果服务器在你登录的计算机以外的计算机上运行,则还需要指定主机名。请与你的管理员联系,以了解你应该使用哪些连接参数进行连接(即,要使用的主机、用户名和密码),一旦知道了正确的参数,就应该能够像这样连接: shell> mysql -h host -u user -pEnter password: ********host和user表示运行MySQL服务器的主机名和MySQL帐户的用户名,替换适合你的设置的值,********代表你的密码,当mysql显示Enter password:提示时输入它。 如果可行,你应该看到一些介绍性信息,然后是mysql>提示符: shell> mysql -h host -u user -pEnter password: ********Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 25338 to server version: 8.0.19-standardType 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql>mysql>提示符告诉你mysql已准备好输入SQL语句。 如果你在运行MySQL的同一台计算机上登录,则可以省略主机,只需使用以下命令: shell> mysql -u user -p如果,当你尝试登录时,会收到错误消息,例如ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2),这意味着MySQL服务器守护程序(Unix)或服务(Windows)未运行。 ...

July 8, 2019 · 1 min · jiezi

MySQL存储引擎概览

查看mysql版本mysql> select version();+------------+| version() |+------------+| 5.6.32-log |+------------+1 row in set (0.00 sec)或者:mysql> status;--------------mysql Ver 14.14 Distrib 5.6.32, for Win32 (AMD64)Connection id: 9Current database:Current user: root@localhostSSL: Not in useUsing delimiter: ;Server version: 5.6.32-log MySQL Community Server (GPL)Protocol version: 10Connection: localhost via TCP/IPServer characterset: latin1Db characterset: latin1Client characterset: gbkConn. characterset: gbkTCP port: 3307Uptime: 4 hours 7 min 11 secThreads: 4 Questions: 126 Slow queries: 0 Opens: 73 Flush tables: 1 Open tables: 66 Queries per second avg: 0.008查看MySQL存储引擎show enginesEngineSupportCommentTransactionsXASavepointsMyISAMYESMyISAM storage engineNONONOMRG_MYISAMYESCollection of identical MyISAM tablesNONONOCSVYESCSV storage engineNONONOBLACKHOLEYES/dev/null storage engine (anything you write to it disappears)NONONOMEMORYYESHash based, stored in memory, useful for temporary tablesNONONOFEDERATEDNOFederated MySQL storage engine(NULL)(NULL)(NULL)ARCHIVEYESArchive storage engineNONONOInnoDBDEFAULTSupports transactions, row-level locking, and foreign keysYESYESYESPERFORMANCE_SCHEMAYESPerformance SchemaNONONOSupport:DEFAULT表示MYSQL数据库默认的存储引擎,其它存储引擎就是你可以选择的。 如上表,InnoDB是默认的存储引擎 ...

July 8, 2019 · 1 min · jiezi

MySQL主从复制遇到错误的处理办法

MySQL在主从复制的时候经常遇到错误而导致Slave复制中断,这个时候就需要人工干涉,来跳过这个错误,才能使Slave端的复制,得以继续进行; 跳过错误的方法: mysql> STOP SLAVE;mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> SHOW GLOBAL VARIABLES LIKE 'SQL_SLAVE_SKIP_COUNTER';Variable_nameValuesql_slave_skip_counter1mysql> START SLAVE;

July 8, 2019 · 1 min · jiezi

了解-Daily-Scrum-活动

如Scrum指南中所述,每日Scrum是一个15分钟的时间盒事件,供开发团队同步活动并为接下来的24小时制定计划。每日Scrum每天都在Sprint举行。在此,开发团队计划在接下来的24小时内开展工作。通过检查自上次每日Scrum以来的工作并预测即将到来的Sprint工作,这可以优化团队协作和性能。Daily Scrum每天都在同一时间和地点举行,以降低复杂性。 Scrum核心的检查与适应 开发团队使用Daily Scrum检查Sprint目标的进展情况,并检查Sprint Backlog中完成工作的进度趋势。Daily Scrum优化了开发团队满足Sprint目标的可能性。每天,开发团队应该了解它打算如何作为一个自组织团队一起工作,以实现Sprint目标,并在Sprint结束时创建预期的增量。开发团队或团队成员经常在每日Scrum之后会面,以进行详细讨论,或者调整或重新规划Sprint的其余工作。 每日Scrums改善沟通,消除其他会议,识别发展障碍,删除,突出和促进快速决策,并提高开发团队的知识水平。这是一次关键的检查和改编会议。 会议结构由开发团队制定,如果重点关注Sprint目标的进展,可以采用不同的方式进行。一些开发团队将使用问题,一些将更多基于讨论。 Scrum Master在每日Scrum中的角色在Scrum Master的保证了开发团队的会议,但开发团队负责进行日常Scrum。Scrum Master教导开发团队将每日Scrum保持在15分钟的时间内。 Daily Scrum是开发团队的内部会议。如果其他人在场,Scrum Master会确保他们不会中断会议。

July 8, 2019 · 1 min · jiezi

每日Scrum中的3个重要问题是什么

这是整个团队简洁地同步每个人的个人进度(Burn down chart)与迭代的Sprint,特征或故事点估计的机会。换句话说,站立是一个状态更新会议,时间限制为十五分钟,下面有三个基本问题。 你昨天做了什么?你今天会做什么?是否有任何阻碍者或障碍阻碍您开展工作?一个强大的Scrum软件,支持Scrum项目管理。它具有Scrum工具,如用户故事地图,产品积压管理,sprint积压管理,任务管理,日常scrum会议,sprint计划工具,sprint审查工具,sprint回顾工具,burndown,障碍,利益相关者和团队管理。 每日Scrum中3个问题的目的在每日的Scrum是一个Sprint期间重点检查和适应的会议。它旨在快速通知每个人整个团队的情况。这不是详细的状态会议。下面列出的是每日Scrum会议的一些好处: 同步团队的工作。识别并消除发展障碍适应每日计划和Sprint Backlog。通过查看和更新燃尽图来跟踪进度[](https://www.visual-paradigm.c...改善团队参与和协作。什么是每日Scrum?持续时间:约15分钟 参与者: Scrum Master,Scrum团队和产品负责人 规则和指南: 在同一时间和地点开始工作日Scrum Master是会议的推动者会议与整个团队一起举行,以便不会延长会议超过15分钟Scrum团队的每个成员都应该回答上面提到的三个问题Scrum团队的每个成员都应该花费不到2到3分钟的时间来回答上述问题这是简单易懂的,但并不是团队用一个声音说话。它还可以快速降级为状态会话,并且不会为sprint backlog的进度带来真正的清晰度。 每日站立会议

July 8, 2019 · 1 min · jiezi

读取燃尽图

什么是燃尽图?燃尽图是在“剩余工作”和“时间”之间绘制的折线图。Scrum团队使用这些图表来跟踪他们在sprint中“烧毁”任务时的进度。 Burndown图表相当容易理解,但团队通常很难理解图表背后的全部含义。 燃尽图的一部分 X轴: 图表的X轴始终表示时间(通常以天为单位)。 Y轴: y轴表示在sprint中要完成的剩余工作。这可以由剩余任务(在任务的数量中)或剩余的努力量(在故事点/小时中)来表示。 进度线: 进度线表示您的团队在冲刺方面的进展情况。它每天都会使用新的剩余估算进行更新。随着冲刺的进行,这条线将指示您的团队是否正常,以及是否需要采取任何纠正措施。 准则: 这是在图表上从左到右向下绘制的对角线。理想情况下,您的冲刺进度线应尽可能接近指南。如果您的团队能够在整个sprint中以稳定的速度完成所有故事,那么您的进度线最终将与指南完全相同。 选择正确的跟踪指标Y轴作为剩余任务的数量: 这是在任何给定日期保留在sprint中的任务数的图表。随着任务在一段时间内完成,进度线开始向下移动。这种方法的最大优点是图形易于理解。 使用这种类型的燃尽图表的缺点是不估计任务。并非所有任务都需要同等的努力来完成。通常情况下,在冲刺结束时离开困难任务的团队发现尽管在大部分时间内处于“正常”状态,但他们无法完成所有任务。 Y轴作为剩余的故事点: 这是随着时间的推移剩余多少故事/估计点的图表。故事点是通过其复杂性来估计任务的好方法。这标准化了完成任务所需的工作量。 该图最终类似于先前的方法,但估计点消除了跟踪任务完成带来的模糊性。 燃尽图何时有用?Burndown图表在以下两个方面都很有用:主动冲刺和冲刺回顾。 冲刺期间: 在正在进行的冲刺期间查看燃尽图表可以帮助Scrum主管或产品负责人回答以下问题: 冲刺是否按目标进展?所有的故事(或任务)都能按时完成吗?需要采取哪些纠正措施来达到目标?冲刺后: Burndown Charts是Sprint团队表现的指标。在sprint回顾中,燃尽图可作为围绕估计准确性,冲刺性能,障碍以及随后冲刺期间所做更改的讨论的参考。 阅读燃尽图通过将冲刺进度线与指南进行比较来读取Burndown图。两条线彼此越接近,在截止日期之前完成所有任务的机会就越大。 落后于时间表:如果进度线高于指南,则意味着您的团队落后于计划,并且理想情况下应该完成更多工作。正轨:进度线和指南紧密相连。如果他们保持目前的速度,团队将击中目标。提前计划:进度线低于指南。即使在冲刺结束日期之前,该团队仍有望达到目标。这可能是因为在计划冲刺时任务被高估了。团队可以向sprint添加更多任务,以确保每个人都在sprint中占用。Burndown图表模式以下是使用燃尽图跟踪冲刺时可能会观察到的一些常见模式。 不正常的状态更新(或)不正确的故事细分 以块为单位更新其状态的团队(例如,在每周结束时)以阶梯图形结束。定期状态更新可提供更准确的图表。理想情况下,Sprint团队应该每天更新他们的任务。 阶梯图有时也是不正确的任务分解的结果。如果任务没有足够的细分,个别问题可能需要很长时间才能完成:导致几天内缺乏进展的错觉。避免这种情况的最佳方法是将大型任务分解为小的可执行工作块。 冲刺结束时更新进度 这是一个团队的燃尽图表,它在冲刺审查会议前一天更新所有状态。此图表在回顾期间增加的价值非常小,团队应确保每天更新其状态。 提前完成。 此图表代表一个团队过高估计完成任务所需的时间。 如果该团队保持当前的速度,他们最终将在sprint结束日期之前完成所有任务。产品所有者需要向sprint添加更多任务(由估计的急剧上升表示),以便在整个sprint期间保持团队忙碌。 落后于时间表。 这是一个努力跟上理想指南的团队的燃尽图。 这很可能是因为他们低估了完成任务所需的工作量。纠正课程的两种方法是 为团队添加更多人(或)通过删除故事或任务来缩小sprint的范围。敏捷与Scrum基础综合Scrum指南什么是Scrum的三大支柱?什么是敏捷软件开发?Scrum在3分钟内完成什么是5个Scrum值?Scrum的演变是什么?经典项目管理与敏捷项目管理为什么Scrum难以掌握?什么是Scrum中的速度?什么是敏捷?什么是Scrum?敏捷中的三个Amigos发展战略是什么?经验过程控制与定义过程控制如何保持Scrum的透明度?Scrum vs Waterfall vs Agile vs Lean vs Kanban什么是Scrum框架中的3355?

July 8, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb使用更新符inc给指定字段增加小于1的值字段的值未更新

【问题详细描述】 字段类型为double,使用更新符$inc给指定字段增加小于1的值,字段的值未更新 ,比如: 1、原始记录,如下: db.foo.bar.find( ) { "price": 25}; 2、使用更新符$inc给"price"字段增加小于1的值,如下: db.foo.bar.update({ $inc: { price: 0.1} } ); 3、查看更新结果,如下: db.foo.bar.find( ) { "price": 25}; 4、由步骤3可知,字段"price"的值未更新。 【解决方法】 该问题在v2.6.4以上版本已修复。

July 8, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb如何查看表字段的数据类型

【问题详细描述】 如何查看表字段的数据类型? 【解决方法】 1、可以使用“操作符 -> 函数操作 -> $type”函数查看字段的数据类型,比如:作为选择符使用,返回字段“a”值的数据类型: db.foo.bar.find( {}, { "a": { "$type": 2 } } ) $type 参考: http://doc.sequoiadb.com/cn/SequoiaDB-cat_id-1477878020-edition_id-302 2、注意从v2.8开始$type已经改为函数操作,不再做为匹配符使用。

July 8, 2019 · 1 min · jiezi

MySQL™-参考手册安装后设置和测试

安装后设置和测试本节讨论安装MySQL后应执行的任务: 如有必要,初始化数据目录并创建MySQL授权表,对于某些MySQL安装方法,可以自动为你完成数据目录初始化: MySQL安装程序执行的Windows安装操作。使用Oracle的服务器RPM或Debian发行版在Linux上安装。在许多平台上使用原生打包系统进行安装,包括Debian Linux、Ubuntu Linux、Gentoo Linux等。使用DMG发行版在macOS上安装。对于其他平台和安装类型,你必须手动初始化数据目录,这些包括在Unix和类Unix系统上从通用二进制和源代码发行版安装,以及从Windows上的ZIP Archive包安装。启动服务器并确保可以访问它。如果在数据目录初始化期间尚未完成密码,则将密码分配给授权表中的初始root帐户,密码可防止未经授权访问MySQL服务器。(可选)安排服务器在系统启动和停止时自动启动和停止。(可选)填充时区表以启用对指定时区的识别。初始化数据目录安装MySQL后,必须初始化数据目录,包括mysql系统模式中的表: 对于某些MySQL安装方法,数据目录初始化是自动的。对于其他安装方法,你必须手动初始化数据目录,这些包括在Unix和类Unix系统上从通用二进制文件和源代码发行版安装,以及从Windows上的ZIP Archive包安装。本节描述如何为非自动初始化数据目录的MySQL安装方法手动初始化数据目录,对于某些建议的命令,它们可以测试服务器是否可访问且工作正常。 在MySQL 8.0中,默认的身份验证插件已从mysql_native_password更改为caching_sha2_password,而'root'@'localhost'管理帐户默认使用caching_sha2_password。数据目录初始化概述在此处显示的示例中,服务器旨在在mysql登录帐户的用户ID下运行,如果帐户不存在,请创建帐户(请参阅创建mysql用户和组),或者替换你计划用于运行服务器的其他现有登录帐户的名称。 将位置更改为MySQL安装的顶级目录,通常是/usr/local/mysql(根据需要调整系统的路径名): cd /usr/local/mysql在目录中,你将找到多个文件和子目录,包括包含服务器以及客户端和实用程序的bin子目录。 secure_file_priv系统变量将导入和导出操作限制为特定目录,创建一个目录,其位置可以指定为该变量的值: mkdir mysql-files将目录用户和组所有权授予mysql用户和mysql组,并相应地设置目录权限: chown mysql:mysql mysql-fileschmod 750 mysql-files使用服务器初始化数据目录,包括包含初始MySQL授权表的mysql模式,该表确定如何允许用户连接到服务器,例如: bin/mysqld --initialize --user=mysql通常,只有在首次安装MySQL后才需要进行数据目录初始化,但是,初始化数据目录的命令不会覆盖任何现有的mysql模式表,因此在任何情况下都可以安全运行。 如果要部署自动支持安全连接的服务器,请使用mysql_ssl_rsa_setup实用程序创建默认SSL和RSA文件: bin/mysql_ssl_rsa_setup如果没有任何选项文件,服务器将以其默认设置启动,要显式指定MySQL服务器在启动时应使用的选项,请将它们放在选项文件中,例如/etc/my.cnf或/etc/mysql/my.cnf。例如,你可以使用选项文件来设置secure_file_priv系统变量。数据目录初始化在mysql模式中创建时区表,但不填充它们。数据目录初始化过程将位置更改为MySQL安装的顶级目录,通常是/usr/local/mysql(根据需要调整系统的路径名): cd /usr/local/mysql要初始化数据目录,请使用--initialize或--initialize-insecure选项调用mysqld,取决于你是希望服务器为'root'@'localhost'帐户生成随机初始密码,还是创建没有密码的帐户: 使用--initialize用于“默认安全”安装(即包括生成随机初始root密码),在这种情况下,密码标记为已过期,你需要选择一个新密码。使用--initialize-insecure,不会生成root密码,这是不安全的。假设你在将服务器投入生产使用之前及时为帐户分配密码。服务器将任何消息(包括任何初始密码)写入其标准错误输出,这可能会重定向到错误日志,因此,如果你没有在屏幕上看到消息,请查看此处。在Windows上,使用--console选项将消息定向到控制台。在Unix和类Unix系统上,重要的是数据库目录和文件归mysql登录帐户所有,以便服务器在以后运行时对它们具有读写权限。要确保这一点,请从系统root帐户启动mysqld并包含--user选项,如下所示: bin/mysqld --initialize --user=mysqlbin/mysqld --initialize-insecure --user=mysql或者,以mysql身份登录时执行mysqld,在这种情况下,你可以省略命令中的--user选项。 在Windows上,使用以下命令之一: bin\mysqld --initialize --consolebin\mysqld --initialize-insecure --console如果缺少必需的系统库,数据目录初始化可能会失败,例如,你可能会看到如下错误:bin/mysqld: error while loading shared libraries:libnuma.so.1: cannot open shared object file:No such file or directory如果发生这种情况,你必须手动或使用系统的软件包管理器安装缺少的库,然后重试数据目录初始化命令。如果mysqld无法识别安装目录或数据目录的正确位置,则可能需要指定其他选项,例如--basedir或--datadir,例如(在一行中输入命令): bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/mysql --datadir=/opt/mysql/mysql/data或者,将相关选项设置放在选项文件中,并将该文件的名称传递给mysqld,对于Unix和类Unix系统,假设选项文件名是/opt/mysql/mysql/etc/my.cnf,将这些行放在文件中: [mysqld]basedir=/opt/mysql/mysqldatadir=/opt/mysql/mysql/data然后按如下方式调用mysqld(首先使用--defaults-file选项在单行上输入命令): bin/mysqld --defaults-file=/opt/mysql/mysql/etc/my.cnf --initialize --user=mysql在Windows上,假设C:\my.ini包含以下行: [mysqld]basedir=C:\\Program Files\\MySQL\\MySQL Server 8.0datadir=D:\\MySQLdata然后按如下方式调用mysqld(首先使用--defaults-file选项在单行上输入命令): ...

July 8, 2019 · 1 min · jiezi

Servlet编写注册登录页面

新建一个servlet项目Flies --> new --> project-->ProjectSDK选择自己的JDK文件-->勾选Web Appliction -->Next 项目构造如下: 设置项目配置File --> Project Structure (快捷键:Ctrl + Shift + Alt + S) --> 选择Module : 配置Tomcat 红色框选择时,运行成功会会自动运行下方的URL链接 测试运行出现如下便创建成功 编写第一个Servlet代码,测试环境是否设置成功@WebServlet("/firstServlet")public class test extends HttpServlet { private String message; @Override public void init() throws ServletException { message = "第一个servlet"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型// response.setContentType("text/html"); response.setHeader("Content-type","text/html;charset=UTF-8"); // 实际的逻辑是在这里 PrintWriter out = response.getWriter(); out.println("<h1>" + message + "</h1>"); } public void destroy() { // 什么也不做 }}注解@WebServlet是设置该类的URL,也可以在web.xml里设置,如下: ...

July 8, 2019 · 1 min · jiezi

MySQL-开启慢查询日志

导语MySQL 默认是没有开启慢查询日志的,可以通过命令行或者修改 my.cnf 来开启。开启后对性能有一定的影响,生产环境不建议开启。我的版本是 5.7.25,下面分别介绍两种开启方式。 命令行首先是进入到 MySQL 的服务中查看下关于慢查询的配置 show variables like 'slow_query_log%';第一行可以看到配置为 OFF,没有开启;第二行是慢查询日志的保存路径,默认值就不修改了。 查看下默认的超时时间配置 show variables like 'long_query_time%';默认是 10 秒,注意是大于配置时间会被记录。 先将超时时间修改为 3 秒 set global long_query_time=3;然后开启配置 set global slow_query_log=1;退出 MySQL 并重新进入测试一下 select sleep(5);去看下慢查询的日志 可以看到日志中已经有了记录。重启服务,并且删除日志,以便下面方法的进行。 修改配置修改 my.cnf,在 [mysqld] 添加下面配置slow_query_log=1slow_query_log_file=/var/lib/mysql/slow-log.loglong_query_time=3重启服务进入 MySQL 测试 select sleep(5);查看日志 结语两种方式都配置成功。需要注意的是使用命令行开启,重启服务后慢查询就会失效;修改配置文件的方式,会一直生效。 参考资料:MySQL 慢查询、MySQL查询优化(3)-慢查询开启、日志分析。

July 7, 2019 · 1 min · jiezi

MySQL™-参考手册在macOS上安装MySQL

在macOS上安装MySQL有关MySQL服务器支持的macOS版本列表,请参阅https://www.mysql.com/support...。 用于macOS的MySQL有多种不同的形式: 原生程序包安装程序,它使用原生macOS安装程序(DMG)引导你完成MySQL的安装,你可以将程序包安装程序与macOS一起使用,用于执行安装的用户必须具有管理员权限。压缩的TAR存档,它使用使用Unix tar和gzip命令打包的文件,要使用此方法,你需要打开终端窗口,使用此方法不需要管理员权限,因为你可以使用此方法在任何地方安装MySQL服务器。在macOS上安装MySQL的一般注意事项你应该记住以下问题和注意事项: 其他MySQL安装:安装过程不承认包管理器(如Homebrew)的MySQL安装,安装和升级过程适用于oracle提供的MySQL包,如果存在其他安装,请考虑在执行此安装程序之前停止它们以避免端口冲突。Homebrew:例如,如果你使用Homebrew将MySQL Server安装到其默认位置,则MySQL安装程序将安装到其他位置,并且不会从Homebrew升级版本。在这种情况下,你最终会遇到多个MySQL安装,默认情况下会尝试使用相同的端口。在运行此安装程序之前停止其他MySQL Server实例,例如执行brew services stop mysql以停止Homebrew的MySQL服务。 Launchd:安装了一个更改MySQL配置选项的launchd守护程序,如果需要,请考虑编辑它,有关其他信息,请参阅下面的文档。此外,macOS 10.10删除了启动项支持,支持launchd守护进程,macOS System Preferences下的可选MySQL首选项窗格使用launchd守护程序。用户:你可能需要(或想要)创建特定的mysql用户来拥有MySQL目录和数据,你可以通过Directory Utility执行此操作,并且mysql用户应该已经存在。要在单用户模式下使用,_mysql的条目(注意下划线前缀)应该已存在于系统/etc/passwd文件中。数据:因为MySQL包安装程序将MySQL内容安装到版本和平台特定目录中,所以你可以使用它来在版本之间升级和迁移数据库,你需要将数据目录从旧版本复制到新版本,或者指定备用datadir值以设置数据目录的位置,默认情况下,MySQL目录安装在/usr/local/下。别名:你可能希望在shell的资源文件中添加别名,以便更轻松地从命令行访问常用程序,如mysql和mysqladmin,bash的语法是: alias mysql=/usr/local/mysql/bin/mysqlalias mysqladmin=/usr/local/mysql/bin/mysqladmin对于tcsh,请使用: alias mysql /usr/local/mysql/bin/mysqlalias mysqladmin /usr/local/mysql/bin/mysqladmin更好的是,将/usr/local/mysql/bin添加到PATH环境变量中,你可以通过修改shell的相应启动文件来完成此操作。 删除:复制先前安装的MySQL数据库文件并成功启动新服务器后,应考虑删除旧的安装文件以节省磁盘空间,此外,你还应删除位于/Library/Receipts/mysql-VERSION.pkg中的旧版本的Package Receipt目录。遗留:在OS X 10.7之前,MySQL服务器与OS X Server捆绑在一起。使用原生软件包在macOS上安装MySQL该软件包位于磁盘映像(.dmg)文件中,你首先需要通过在Finder中双击其图标来装载该文件,然后它应该挂载映像并显示其内容。 在继续安装之前,请确保通过使用MySQL Manager应用程序(在macOS Server上)、首选项窗格或在命令行上使用mysqladmin shutdown来停止所有正在运行的MySQL服务器实例。要使用软件包安装程序安装MySQL: 下载包含MySQL软件包安装程序的磁盘映像(.dmg)文件(此处提供社区版本),双击该文件以装入磁盘映像并查看其内容。双击磁盘中的MySQL安装程序包,它根据你下载的MySQL版本命名,例如,对于MySQL服务器8.0.19,它可能被命名为mysql-8.0.19-osx-10.13-x86_64.pkg。 初始向导介绍屏幕引用要安装的MySQL服务器版本,单击Continue开始安装。MySQL社区版显示了相关GNU通用公共许可证的副本,单击Continue,然后单击Agree继续。 在Installation Type页面中,你可以单击Install以使用所有默认值执行安装向导,单击Customize以更改要安装的组件(MySQL服务器、MySQL测试、首选项窗格、启动支持 — 默认情况下启用除MySQL测试之外的所有组件)。虽然可以看到Change Install Location选项,但无法更改安装位置。MySQL软件包安装程序向导:安装类型MySQL包安装程序向导:自定义 单击Install以安装MySQL Server,如果升级当前的MySQL Server安装,安装过程将在此处结束,否则请按照向导的新MySQL服务器安装的其他配置步骤进行操作。成功安装新的MySQL服务器后,通过选择密码的默认加密类型、定义root密码以及启动时启动(或禁用)MySQL服务器来完成配置步骤。默认的MySQL 8.0密码机制是caching_sha2_password(强),此步骤允许你将其更改为mysql_native_password(遗留)。 选择旧密码机制会更改生成的launchd文件以在ProgramArguments下设置--default_authentication_plugin=mysql_native_password。选择强密码加密不会设置--default_authentication_plugin,因为使用了默认的MySQL Server值,即caching_sha2_password。 为root用户定义密码,并在配置步骤完成后切换MySQL Server是否应该启动。 Summary是最后一步,并引用了成功且完整的MySQL Server安装,Close向导。 MySQL服务器现已安装,如果你选择不启动MySQL,则使用命令行中的launchctl或使用MySQL首选项窗格单击Start启动MySQL,使用MySQL Preference Pane或launchd将MySQL配置为在启动时自动启动。 使用软件包安装程序进行安装时,文件将安装到/usr/local中与安装版本和平台名称相匹配的目录中。例如,安装程序文件mysql-8.0.19-osx10.13-x86_64.dmg将MySQL安装到/usr/local/mysql-8.0.19-osx10.13-x86_64/,并带有符号链接到/usr/local/mysql,下表显示了此MySQL安装目录的布局。 目录目录的内容binmysqld服务器、客户端和实用程序data日志文件、数据库,其中/usr/local/mysql/data/mysqld.local.err是默认错误日志docs帮助文档,如发行说明和构建信息include包含(头)文件lib库manUnix手册页mysql-testMySQL测试套件(使用安装程序包(DMG)时,在安装过程中默认禁用'MySQL Test')share其他支持文件,包括错误消息、示例配置文件、用于数据库安装的SQLsupport-files脚本和示例配置文件/tmp/mysql.sockMySQL Unix socket的位置安装和使用MySQL启动守护程序macOS使用启动守护程序自动启动、停止和管理MySQL等进程和应用程序。 默认情况下,macOS上的安装包(DMG)会安装名为/Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist的launchd文件,其中包含类似于以下内容的plist定义: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.oracle.oss.mysql.mysqld</string> <key>ProcessType</key> <string>Interactive</string> <key>Disabled</key> <false/> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>SessionCreate</key> <true/> <key>LaunchOnlyOnce</key> <false/> <key>UserName</key> <string>_mysql</string> <key>GroupName</key> <string>_mysql</string> <key>ExitTimeOut</key> <integer>600</integer> <key>Program</key> <string>/usr/local/mysql/bin/mysqld</string> <key>ProgramArguments</key> <array> <string>/usr/local/mysql/bin/mysqld</string> <string>--user=_mysql</string> <string>--basedir=/usr/local/mysql</string> <string>--datadir=/usr/local/mysql/data</string> <string>--plugin-dir=/usr/local/mysql/lib/plugin</string> <string>--log-error=/usr/local/mysql/data/mysqld.local.err</string> <string>--pid-file=/usr/local/mysql/data/mysqld.local.pid</string> <string>--keyring-file-data=/usr/local/mysql/keyring/keyring</string> <string>--early-plugin-load=keyring_file=keyring_file.so</string> </array> <key>WorkingDirectory</key> <string>/usr/local/mysql</string></dict></plist>一些用户报告说,添加plist DOCTYPE声明会导致launchd操作失败,尽管它通过了lint检查,怀疑这是一个copy-n-paste错误,包含上述代码段的文件的md5校验和是d925f05f6d1b6ee5ce5451b596d6baed。要启用launchd服务,你可以: ...

July 7, 2019 · 1 min · jiezi

高并发探测三分布式场景常见问题之速度优化数据同步问题

场景需求对于已有的mysql主从项目,应对数据量大时往往采取分库分表的做法,为了缩短页面响应采用一主多从的 主写+从读 的读写分离架构。redis:Redis中文网:内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理...。使用redis一:使用redis作为php的缓存层,存储常用、相对固定的公共数据;二:添加redis缓存,组成 mysql写+ redis读 的架构;三:甚至直接采用 redis读+写 的架构。mysql迁移redis需要后台程序的紧密配合。“读写分离”容易出现数据不一致的问题。 一些优化相关传统前后端优化途径: 1. 前端 减少请求次数:css精灵(小图合并到大图),data-image(data-icon:src=data:image/jpg;base64;xx,小图合并到js文件); 2. 网关 web资源防盗链refer监测,nginx限流,nginx负载均衡、nginx缓存静态资源、gzip等,http2.0; 3. 后端 使用redis、memcache缓存,mysql优化;进阶: 1. 网关 mysql迁移redis,分布式集群部署; 2. 后端 添加针对高并发的消息队列,多线程、协程化,使用连接池;分布式部署常见问题: 登录session共享问题;读写分离的同步数据问题。另外还各种诸如图片数据库、对象存储等。1.分布式问题的一致处理要同时在多台服务器上处理比如:库存超卖、订单支付问题需要频繁的过程校验,所以对并行任务串行化、使用一台机器、单一线程处理这种一致性问题最为稳妥。应对大数据量的情况采用消息队列,平衡服务器压力。 a.RabbitMQ消息队列

July 7, 2019 · 1 min · jiezi

MySQL™-参考手册在Linux上安装MySQL

在Linux上安装MySQLLinux支持许多不同的安装MySQL的解决方案,建议使用Oracle提供的发行版中之一,其中有几种安装方法可供使用: 类型安装方法Apt启用MySQL Apt存储库Yum启用MySQL Yum存储库Zypper启用MySQL SLES存储库RPM下载特定包DEB下载特定包Generic下载通用包Source从源代码编译Docker使用Docker Hub for MySQL Community Edition从My Oracle Support下载MySQL Enterprise Edition的Docker镜像Oracle Unbreakable Linux Network使用ULN渠道作为备选项,你可以使用系统上的软件包管理器自动从Linux发行版的原生软件存储库下载和安装MySQL软件包,这些原生包通常是当前可用版本的几个版本。你通常也无法安装开发里程碑版本(DMR),因为这些版本通常不在原生存储库中提供。 对于许多Linux安装,你需要设置MySQL以在计算机启动时自动启动,许多原生程序包安装都会为你执行此操作,但对于源代码、二进制和RPM解决方案,你可能需要单独进行此设置。所需的脚本mysql.server可以在MySQL安装目录下的support-files目录中找到,也可以在MySQL源代码树中找到,你可以将其安装为/etc/init.d/mysql以自动启动和关闭MySQL。使用MySQL Yum存储库在Linux上安装MySQLOracle Linux、Red Hat Enterprise Linux、CentOS和Fedora的MySQL Yum存储库提供了用于安装MySQL服务器、客户端、MySQL Workbench、MySQL实用程序、MySQL路由器、MySQL Shell、Connector/ODBC、Connector/Python等的RPM包(并非所有的包都适用于所有发行版)。 在你开始之前作为一种流行的开源软件,MySQL以其原始或重新打包的形式广泛安装在许多系统上,来自各种来源,包括不同的软件下载站点、软件存储库等等,以下说明假定你的系统上尚未使用第三方发行的RPM软件包安装MySQL。 完全安装MySQL的步骤按照以下步骤使用MySQL Yum存储库安装最新的GA版本的MySQL: 添加MySQL Yum存储库首先,将MySQL Yum存储库添加到系统的存储库列表中,这是一次性操作,可以通过安装MySQL提供的RPM来执行,跟着这些步骤: 转到MySQL Developer Zone中的下载MySQL Yum存储库页面(https://dev.mysql.com/downloa...)。选择并下载适用于你的平台的发行包。使用以下命令安装下载的发行包,将platform-and-version-specific-package-name替换为下载的RPM包的名称:shell> sudo yum localinstall platform-and-version-specific-package-name.rpm对于基于EL6的系统,该命令采用以下形式: shell> sudo yum localinstall mysql80-community-release-el6-{version-number}.noarch.rpm对于基于EL7的系统: shell> sudo yum localinstall mysql80-community-release-el7-{version-number}.noarch.rpm对于Fedora 30: shell> sudo dnf localinstall mysql80-community-release-fc30-{version-number}.noarch.rpm对于Fedora 29: shell> sudo dnf localinstall mysql80-community-release-fc29-{version-number}.noarch.rpm安装命令将MySQL Yum存储库添加到系统的存储库列表中,并下载GnuPG密钥以检查软件包的完整性。 你可以通过以下命令检查MySQL Yum存储库是否已成功添加(对于启用了dnf的系统,使用dnf替换命令中的yum): shell> yum repolist enabled | grep "mysql.*-community.*"一旦在你的系统上启用了MySQL Yum存储库,Yum update命令(或支持dnf的系统的dnf upgrade)执行的任何系统范围内的更新都将在你的系统上升级MySQL包,并且如果Yum在MySQL Yum存储库中找到替代包,还将替换任何原生第三方包。选择发行系列使用MySQL Yum存储库时,默认选择安装最新的GA系列(当前为MySQL 8.0),如果这是你想要的,你可以跳到下一步,安装MySQL。 ...

July 7, 2019 · 2 min · jiezi

MySQL™-参考手册使用通用二进制文件在UnixLinux上安装MySQL

使用通用二进制文件在Unix/Linux上安装MySQLOracle提供了一组MySQL的二进制发行版,这些包括用于许多平台的压缩tar文件(扩展名为.tar.xz的文件)形式的通用二进制发行版,以及针对所选平台的特定于平台的包格式的二进制文件。 本节介绍在Unix/Linux平台上从压缩的tar文件二进制发行版安装MySQL,有关其他特定于平台的二进制包格式,请参阅本手册中其他特定于平台的部分。 MySQL压缩的tar文件二进制发行版具有mysql-VERSION-OS.tar.xz形式的名称,其中VERSION是一个数字(例如,8.0.19),以及OS表示发新版所针对的操作系统的类型(例如,pc-linux-i686或winx64)。 还有用于Linux通用二进制发行版的MySQL压缩tar文件的“最小安装”版本,其名称形式为mysql-VERSION-OS-minimal.tar.xz,最小安装发行版不包括调试二进制文件,并且剥离了debug标记,使其明显小于常规二进制发行版。如果你选择安装最小安装发行版,请记住在随后的说明中调整文件名格式的差异。 如果你以前使用操作系统原生程序包管理系统(如Yum或APT)安装了MySQL,则使用原生二进制文件安装时可能会遇到问题,确保你之前的MySQL安装已完全删除(使用你的包管理系统),并且还删除了任何其他文件,例如旧版本的数据文件。你还应该检查配置文件,例如/etc/my.cnf或/etc/mysql目录并删除它们。 有关使用官方MySQL软件包替换第三方软件包的信息,请参阅相关的APT指南或Yum指南。 MySQL依赖于libaio库,如果未在本地安装此库,则数据目录初始化和后续服务器启动步骤将失败,如有必要,请使用适当的包管理器进行安装,例如,在基于Yum的系统上: shell> yum search libaio # search for infoshell> yum install libaio # install library或者,在基于APT的系统上: shell> apt-cache search libaio # search for infoshell> apt-get install libaio1 # install library要安装压缩的tar文件二进制发行版,请在你选择的安装位置解压缩它(通常是/usr/local/mysql),这将创建下表中显示的目录。 目录目录的内容binmysqld服务器、客户端和实用程序docs信息格式的MySQL手册manUnix手册页include包含(header)文件lib函数库share用于数据库安装的错误消息、字典和SQLsupport-files其他支持文件mysqld二进制文件的调试版本可用作mysqld-debug,要从源代码发行版中编译自己的MySQL调试版,请使用相应的配置选项来启用调试支持。 要安装和使用MySQL二进制发行版,命令序列如下所示: shell> groupadd mysqlshell> useradd -r -g mysql -s /bin/false mysqlshell> cd /usr/localshell> tar xvf /path/to/mysql-VERSION-OS.tar.xzshell> ln -s full-path-to-mysql-VERSION-OS mysqlshell> cd mysqlshell> mkdir mysql-filesshell> chown mysql:mysql mysql-filesshell> chmod 750 mysql-filesshell> bin/mysqld --initialize --user=mysqlshell> bin/mysql_ssl_rsa_setupshell> bin/mysqld_safe --user=mysql &# Next command is optionalshell> cp support-files/mysql.server /etc/init.d/mysql.server此过程假定你具有对系统的root(管理员)访问权限,或者,你可以使用sudo(Linux)或pfexec(Solaris)命令为每个命令添加前缀。mysql-files目录提供了一个方便的位置,可用作secure_file_priv系统变量的值,该变量将导入和导出操作限制到特定目录。 ...

July 7, 2019 · 1 min · jiezi

MySQL™-参考手册通用安装指南

通用安装指南以下部分包含选择、下载和验证你的发行版所需的信息,本章后面部分中的说明介绍了如何安装所选的发行版。 要安装的MySQL版本和分发版MySQL可在许多操作系统和平台上使用,有关官方支持的平台的信息,请参阅MySQL网站上的https://www.mysql.com/support...。 准备安装MySQL时,请确定要使用的版本和发行版格式(二进制文件或源代码)。 首先,决定是安装开发版本还是通用可用性(GA)版本,开发版本具有最新功能,但不建议用于生产,GA版本,也称为生产版或稳定版,适用于生产用途,建议使用最新的GA版本。 MySQL 8.0中的命名方案使用包含三个数字和可选后缀的版本名称(例如,mysql-8.0.1-dmr),版本名称中的数字解释如下: 第一个数字(8)是主要版本号。第二个数字(0)是次要版本号,总的来说,主要和次要数字构成了发行系列号,系列号描述了稳定的特性集。第三个数字(1)是发行系列中的版本号,对于每个新的错误修复版本,这都会增加,在大多数情况下,系列中的最新版本是最佳选择。版本名称还可以包含后缀以指示版本的稳定性级别,通过一组后缀在一系列过程中发行,以指示稳定性级别如何提高,可能的后缀是: dmr表示开发里程碑版本(DMR),MySQL开发使用里程碑模型,其中每个里程碑都引入了一小部分经过全面测试的特性。从一个里程碑到下一个里程碑,特性接口可能会发生变化,甚至可能会删除特性,这取决于尝试这些早期版本的社区成员提供的反馈,里程碑版本中的特性可被视为具有预生产质量。rc表示发布候选(RC),通过MySQL的所有内部测试后,发布候选版本被认为是稳定的,RC版本中可能仍会引入新特性,但重点转移到修复错误以稳定系列早期介绍的特性。缺少后缀表示通用可用性(GA)或生产版本,GA版本是稳定的,已成功通过早期版本阶段,并且被认为是可靠的,没有严重的错误,并且适用于生产系统。系列中的开发始于DMR版本,随后是RC版本,最后达到GA状态版本。 选择要安装的MySQL版本后,确定要为你的操作系统安装哪种发行版格式,对于大多数用例,二进制发行版是正确的选择。对于许多平台,二进制发行版以原生格式提供,例如Linux的RPM包或OS X的DMG包,发行版还提供更通用的格式,如Zip压缩文件或压缩tar文件。在Windows上,你可以使用MySQL安装程序来安装二进制发行版。 在某些情况下,最好从源代码发行版安装MySQL: 你想在某个显式位置安装MySQL,标准二进制发行版已准备好在任何安装位置运行,但你可能需要更灵活地将MySQL组件放置在你想要的位置。你希望使用可能未包含在标准二进制发行版中的特性来配置mysqld,下面是一些最常见的额外选项,用于确保特性可用性: -DWITH_LIBWRAP=1用于TCP包装器支持。-DWITH_ZLIB={system|bundled}用于依赖于压缩的特性。-DWITH_DEBUG=1用于调试支持你希望配置mysqld时不使用标准二进制发行版中包含的一些特性。你想要读取或修改构成MySQL的C和C++代码,为此,获取源代码发行版。源代码发行包含比二进制发行版更多的测试和示例。如何获取MySQL有关MySQL当前版本和下载说明的信息,请访问https://dev.mysql.com/downloads/上的下载页面。有关MySQL下载镜像站点的完整最新列表,请参阅https://dev.mysql.com/downloa...,你还可以在那里找到有关成为MySQL镜像站点以及如何报告错误或过时镜像的信息。 对于使用Yum作为其包管理系统的基于RPM的Linux平台,可以使用MySQL Yum Repository安装MySQL。 对于基于Debian的Linux平台,可以使用MySQL APT Repository安装MySQL。 对于SUSE Linux Enterprise Server(SLES)平台,可以使用MySQL SLES存储库安装MySQL。 使用MD5校验和或GnuPG验证程序包完整性下载适合你需要的MySQL软件包之后,在尝试安装之前,请确保它完好无损且未被篡改,有三种完整性检查方法: MD5校验和使用GnuPG(GNU Privacy Guard)的加密签名对于RPM包,内置RPM完整性验证机制以下部分描述了如何使用这些方法。 如果你注意到MD5校验和或GPG签名不匹配,请首先尝试再次下载相应的程序包,可能是从另一个镜像站点下载。 验证MD5校验和下载MySQL软件包后,应确保其MD5校验和与MySQL下载页面上提供的校验和匹配,每个包都有一个单独的校验和,你可以根据下载的包进行验证。每个MySQL产品的下载页面上都列出了正确的MD5校验和,你将把它与你下载的文件(产品)的MD5校验和进行比较。 每个操作系统和设置都提供了自己的工具版本,用于检查MD5校验和,通常,该命令名为md5sum,或者可能命名为md5,某些操作系统根本不提供它。在Linux上,它是GNU Text Utilities包的一部分,可用于各种平台,你也可以从http://www.gnu.org/software/t...下载源代码。如果安装了OpenSSL,则可以使用命令openssl md5 package_name。有关md5命令行实用程序的Windows实现,请访问http://www.fourmilab.ch/md5/,winMd5Sum是一个图形化的MD5检查工具,可以从http://www.nullriver.com/inde...获得,Microsoft Windows示例将假设名称为md5.exe。 Linux和Microsoft Windows示例: shell> md5sum mysql-standard-8.0.19-linux-i686.tar.gzaaab65abbec64d5e907dcd41b8699945 mysql-standard-8.0.19-linux-i686.tar.gzshell> md5.exe mysql-installer-community-8.0.19.msiaaab65abbec64d5e907dcd41b8699945 mysql-installer-community-8.0.19.msi你应该验证生成的校验和(十六进制数字的字符串)是否与相应程序包正下方的下载页面上显示的校验和相匹配。 确保验证存档文件的校验和(例如,.zip、.tar.gz或.msi文件),而不是存档中包含的文件的校验和,换句话说,在提取其内容之前验证该文件。使用GnuPG进行签名检查验证包的完整性和真实性的另一种方法是使用加密签名,这比使用MD5校验和更可靠,但需要更多工作。 用GnuPG(GNU Privacy Guard)签署MySQL可下载的软件包,GnuPG是Phil Zimmermann著名的Pretty Good Privacy(PGP)的开源替代品,大多数Linux发行版默认安装了GnuPG,否则,请参阅http://www.gnupg.org/以获取有关GnuPG以及如何获取和安装它的更多信息。 要验证特定包的签名,首先需要获取公共GPG构建密钥的副本,你可以从http://pgp.mit.edu/下载该密钥,你想要获取的密钥名为mysql-build@oss.oracle.com,或者,你可以直接从以下文本复制并粘贴密钥: -----BEGIN PGP PUBLIC KEY BLOCK-----Version: GnuPG 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=ghXk-----END PGP PUBLIC KEY BLOCK-----要将构建密钥导入到你的个人公共GPG钥匙串中,请使用gpg --import,例如,如果已将密钥保存在名为mysql_pubkey.asc的文件中,则import命令如下所示: shell> gpg --import mysql_pubkey.ascgpg: key 5072E1F5: public key "MySQL Release Engineering<mysql-build@oss.oracle.com>" importedgpg: Total number processed: 1gpg: imported: 1gpg: no ultimately trusted keys found你还可以使用公钥ID 5072E1F5从公钥服务器下载密钥: ...

July 7, 2019 · 2 min · jiezi

MySQL™-参考手册MySQL信息源

MySQL信息源本节列出了你可能会发现有用的其他信息的来源,例如MySQL网站、邮件列表、用户论坛和Internet中继聊天。 MySQL网站MySQL文档的主要网站是https://dev.mysql.com/doc/,在线和可下载的文档格式可用于MySQL参考手册、MySQL连接器等。 MySQL开发人员作为MySQL服务器博客提供有关新功能和即将推出的功能的信息。 MySQL论坛上的MySQL社区支持http://forums.mysql.com上的论坛是一个重要的社区资源,许多论坛都可用,分为以下常规类别: 迁移MySQL用法MySQL连接器编程语言工具第三方应用程序存储引擎MySQL技术SQL标准商业MySQL企业版Oracle以MySQL Enterprise的形式提供技术支持,对于依赖MySQL DBMS进行业务关键型生产应用程序的组织,MySQL Enterprise是一种商业订阅产品,包括: MySQL Enterprise ServerMySQL Enterprise Monitor每月快速更新和季度服务包MySQL知识库全天候技术和咨询支持MySQL Enterprise有多个层,使你可以灵活地选择最符合你需求的服务级别,有关更多信息,请参阅MySQL Enterprise。

July 6, 2019 · 1 min · jiezi

mysql梳理2

mysql逻辑架构 最上层不是Mysql独有的, 比如连接处理,授权认证, 安全 等等 第二层核心服务功能,包括查询解析,分析,优化,缓存以及所有内置函数,存储过程,触发器,视图等都在这层实现 第三层 存储引擎,存储引擎API包含几十个底层函数。 优化与执行:每个连接都会在mysql服务端产生一个线程(内部通过线程池管理线程),比如一个select语句进入,mysql首先会在查询缓存中查找是否缓存了这个select的结果集,如果没有则继续执行 解析、优化、执行的过程;否则会之间从缓存中获取结果集。 MySQL解析查询会创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。 (用户可以通过特殊的关键字提示优化器,影响它的决策过程。也可以请求优化器解释优化过程的各个因素)MySQL原理与实践,一共六篇 存储引擎mysql数据库支持插件式存储引擎。就是说支持多种存储引擎,甚至用户可以按照自己的需要定制和使用自己的存储引擎。 mysql5.5之前默认存储引擎是MyISAM,5.5后改为InnoDB。MySQL数据库各个版本的区别、以及不同引擎的适用环境 日志执行update时,更新语句涉及到了数据的更改,所以必不可少的需要引入日志模块。 redo log是InnoDB引擎特有的日志模块;binlog是Server层自带的日志模块。 redo log重做日志在更新数据写入内存的同时,会先更新内存记录redo log,然后顺序写入磁盘,而不是等内存占满之后再持久化,这样当数据库异常宕机之后,我们可以根据redo log重做日志来恢复数据,保证之前提交的数据不会丢失。 各种不同操作有不同的重做日志格式。 bin log归档日志binlog是逻辑日志,记录本次修改的原始逻辑,说白了就是记录了修改数据的SQL语句。 通过mysqlbinlog可以解析查看binlog日志。 在今天中午12点的时候,发现上午10点执行了错误的SQL语句,想把数据库状态恢复到上午10点,错误语句执行之前。那么该怎么办呢?数据恢复步骤如下:首先你要拿到最近一次的备份库拿到最近备份库开始到出错时候的所有binlog(binlog日志保留时间可以自定义)使用binlog重放到错误发生之前。undo log回滚日志主要用于事务的回滚。 索引是一种优化查询的数据结构。 索引数据结构常用的有哈希表、完全平衡二叉搜索树、B树、B+树等数据结构。 一个表的数据行数越多,那么对应的索引文件其实也是会很大的,实际上也是需要存储在磁盘中的,而不能全部都放在内存中,所以我们在考虑选用哪种数据结构时,我们可以换一个角度思考,哪个数据结构更适合从磁盘中读取数据,或者哪个数据结构能够提高磁盘的IO效率。 MySQL中的索引是B+树实现的,MySQL为何选择使用B+树?得看看其他数据结构实现的索引的特点: 哈希表比如给name字段建立hash索引的情况下 首先数据库底层会计算name字段各行值对应的hash值作为数组下标,其中可能会有hash冲突,存储对应的那一行数据的地址。 当直接执行select * from users where name = 'tom';的时候,数据库会计算'tom'的hash值,得到数组下标,然后直接从数据中取出数据并拿到锁对应的那一行数据的地址,进而在数据表文件中查询那一行数据。 但是当执行select * from users where name > 'tom';时,索引将不再起作用。 哈希表并不是有序的,可以快速的精确查询,但是不支持范围查询。所以只适合做等值查询,区间查询的效率很低!好像字典里的索引去掉了排序。 完全平衡二叉搜索树二叉搜索树的特点:每个节点的左儿子小于父节点,父节点又小于右儿子。由于完全平衡二叉搜索树是有序的,所以支持范围查找。 二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N 叉”树。“N”取决于数据块的大小。 B树同样的数据,B树表示的要比完全平衡二叉搜索树要 "矮",原因在于B树中的一个节点可以存储多个元素。 B+树B+树是B树的升级版,只是把非叶子节点冗余一下,这么做的好处是 为了提高范围查找的效率。 同样的元素,B+树的表示要比B树要 "胖",原因在于所有的叶子结点包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。 非叶子节点也会冗余一份所有的中间节点元素,它们是最大(或最小)元素。 B+树作为索引的优势提高查询索引时的磁盘IO效率,并且可以提高范围查询的效率,并且B+树里的元素也是有序的,叶子节点形成有序链表,便于范围查询。参考的这篇博客 索引类型主键索引对于主健,oracle/sql server/mysql等都会自动建立唯一索引。 主键索引是唯一索引的特殊类型。= 唯一索引+ not null ...

July 6, 2019 · 2 min · jiezi

MySQL™-参考手册MySQL数据库管理系统概述

MySQL数据库管理系统概述MySQL是最受欢迎的开源SQL数据库管理系统,由Oracle Corporation开发、分发和支持。 什么是MySQL?MySQL网站(http://www.mysql.com/)提供有关MySQL软件的最新信息。 MySQL是一个数据库管理系统数据库是数据的结构化集合,它可以是从简单的购物清单到图片库或公司网络中的大量信息。要添加、访问和处理存储在计算机数据库中的数据,你需要一个数据库管理系统,如MySQL Server。由于计算机非常擅长处理大量数据,因此数据库管理系统在计算、作为独立的实用程序或其他应用程序的一部分中发挥着核心作用。 MySQL数据库是关系型的关系型数据库将数据存储在单独的表中,而不是将所有数据放在一个大的库房中,数据库结构被组织成针对速度优化的物理文件。逻辑模型具有数据库、表、视图、行和列等对象,可提供灵活的编程环境。你可以设置规则来控制不同数据字段之间的关系,例如一对一、一对多、唯一、必需或可选,以及不同表之间的“指针”。数据库强制执行这些规则,因此使用设计良好的数据库,你的应用程序永远不会看到不一致、重复、孤立、过期或丢失的数据。 “MySQL”的SQL部分代表“结构化查询语言”,SQL是用于访问数据库的最常用的标准化语言。取决于你的编程环境,你可以直接输入SQL(例如,生成报告)、将SQL语句嵌入到用其他语言编写的代码中,或使用隐藏SQL语法的特定于语言的API。 SQL由ANSI/ISO SQL标准定义,SQL标准自1986年以来一直在发展,并且存在多个版本。在本手册中,“SQL-92”是指1992年发布的标准,“SQL:1999”是指1999年发布的标准,“SQL:2003”是指当前版本的标准,在任何时候都使用短语“SQL标准”来表示当前版本的SQL标准。 MySQL软件是开源的开源意味着任何人都可以使用和修改软件,任何人都可以从互联网上下载MySQL软件并使用它而无需支付任何费用,如果你愿意,你可以学习源代码并根据需要进行更改。MySQL软件使用GPL(GNU通用公共许可证)http://www.fsf.org/licenses/来定义在不同情况下你可以和不可以使用该软件的内容,如果你对GPL感到不舒服或需要将MySQL代码嵌入到商业应用程序中,你可以从oracle购买商业许可版本,有关更多信息,请参阅MySQL许可概述(http://www.mysql.com/company/...)。 MySQL数据库服务器非常快速、可靠、可伸缩且易于使用如果这正是你正在寻找的,那么你应该尝试一下。MySQL Server可以在台式机或笔记本电脑上轻松运行,与其他应用程序、Web服务器等一起运行,几乎不需要注意什么。如果你将整台机器专用于MySQL,则可以调整设置以利用所有可用的内存、CPU功率和I/O容量,MySQL还可以扩展到联网的集群机器。 MySQL Server最初是为了比现有解决方案更快地处理大型数据库而开发的,并且已经成功地在高要求的生产环境中使用了好几年,尽管在不断的开发中,MySQL Server提供了一组丰富而有用的功能,它的连接性、速度和安全性使MySQL Server非常适合访问Internet上的数据库。 MySQL Server适用于客户端/服务器或嵌入式系统MySQL数据库软件是一个客户端/服务器系统,由支持不同后端的多线程SQL服务器、几个不同的客户端程序和库、管理工具、和广泛的应用程序编程接口(API)组成。 还提供MySQL Server作为嵌入式多线程库,你可以将其链接到你的应用程序,以获得更小、更快、更易于管理的独立产品。 大量贡献的MySQL软件是可用的MySQL Server有一组与用户紧密合作开发的实用功能,你最喜欢的应用程序或语言很可能支持MySQL数据库服务器。 MySQL的主要特性本节介绍MySQL数据库软件的一些重要特性,在大多数方面,该路线图适用于所有版本的MySQL,有关在特定于系列的基础上引入MySQL的特性的信息,请参阅相应手册。 内部结构和可移植性用C和C++编写。经过广泛的不同编译器测试。适用于许多不同的平台,请参阅https://www.mysql.com/support...。为了可移植性,在MySQL 5.5及以上版本中使用CMake,以前的系列使用GNU Automake,Autoconf和Libtool。使用Purify(商业内存泄漏检测器)以及GPL工具Valgrind(http://developer.kde.org/~sew...)进行测试。使用具有独立模块的多层服务器设计。设计为使用内核线程完全多线程,以便在可用时轻松使用多个CPU。提供事务性和非事务性存储引擎。使用具有索引压缩的非常快速的B树磁盘表(MyISAM)。设计为使添加其他存储引擎相对容易,如果要为内部数据库提供SQL接口,这非常有用。使用非常快速的基于线程的内存分配系统。使用优化的内嵌循环连接执行非常快速的连接。实现内存中的哈希表,用作临时表。使用应尽可能快的高度优化的类库实现SQL函数,通常在查询初始化之后根本没有内存分配。将服务器作为单独的程序提供,用于客户端/服务器网络环境,以及作为可嵌入(链接)到独立应用程序的库,此类应用程序可以单独使用,也可以在没有网络的环境中使用。数据类型许多数据类型:1、2、3、4和8字节长的有符号/无符号整数、FLOAT、DOUBLE、CHAR,VARCHAR、BINARY、VARBINARY、TEXT、BLOB、DATE、TIME、DATETIME、TIMESTAMP、YEAR、SET、ENUM和OpenGIS空间类型.固定长度和可变长度的字符串类型。语句和函数查询的SELECT列表和WHERE子句中提供完整的操作符和函数支持,例如: mysql> SELECT CONCAT(first_name, ' ', last_name) -> FROM citizen -> WHERE income/dependents > 10000 AND age > 30;完全支持SQL GROUP BY和ORDER BY子句,支持组函数(COUNT()、AVG()、STD()、SUM()、MAX()、MIN()、GROUP_CONCAT())。使用标准SQL和ODBC语法支持LEFT OUTER JOIN和RIGHT OUTER JOIN。根据标准SQL的要求支持表和列上的别名。MySQL的历史Oracle一开始打算使用mSQL数据库系统,使用他们快速低级(ISAM)例程连接到表,但是,经过一些测试,得出的结论是,mSQL不够快或不够灵活,无法满足需求。这导致了数据库的新SQL接口,但具有与mSQL几乎相同的API接口,此API旨在使编写用于mSQL的第三方代码可以轻松移植到MySQL。 MySQL以联合创始人Monty Widenius的女儿My命名。 MySQL Dolphin(logo)的名称是“Sakila”,它是从“海豚名人”比赛用户建议的大量名字中选出的,获奖名称由非洲斯威士兰的开源软件开发商Ambrose Twebaze提交,根据Ambrose的说法,女性化的名字Sakila源于SiSwati,Swaziland的当地语言,Sakila也是坦桑尼亚阿鲁沙一个小镇的名字,靠近Ambrose的原籍Uganda。 上一篇:语法约定

July 6, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb官方有提供现成的性能测试工具吗

【问题详细描述】 官方有提供现成的性能测试工具吗? 【解决方法】 1、目前v3.2没有提供性能测试工具; 2、可以借用第三方性能测试框架,比如:YCSB, 利用YCSB测试巨杉数据库性能的步骤可以参考: https://my.oschina.net/jishux...。

July 5, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb是不是只要升级了sac所在机器就能升级整个sdb集群

【问题详细描述】 多节点升级需要每台上执行升级,还是只升级安装SAC的那台机器? 【解决方法】 1、不是,集群中的每台机器都需要升级; 2、v3.2升级命令,如: ./sequoiadb-3.2-linux_x86_64-enterprise-installer.run --installmode upgrade --mode text; 升级步骤,详细可见: http://doc.sequoiadb.com/cn/i...; 3、可以使用./sequoiadb-3.2-linux_x86_64-enterprise-installer.run --help命令查看帮助信息。

July 5, 2019 · 1 min · jiezi

MySQL™-参考手册关于本手册

关于本手册MySQL™软件提供了一个非常快速、多线程、多用户、强大的SQL(结构化查询语言)数据库服务器,MySQL Server适用于关键任务、重负荷生产系统以及嵌入到大规模部署的软件中。 MySQL软件是双重授权的,用户可以根据GNU通用公共许可证(http://www.fsf.org/licenses/)的条款选择MySQL软件作为开源产品使用,也可以从Oracle购买标准商业许可证,有关许可政策的更多信息,请访问http://www.mysql.com/company/...。 这是MySQL数据库系统8.0版到8.0.19版的参考手册,MySQL 8.0的次要版本之间的差异在本文中引用了版本号(8.0.x),有关许可证信息,请参阅法律声明。 由于MySQL 8.0和以前版本之间存在许多功能和其他差异,因此本手册不适用于旧版本的MySQL软件。如果你使用的是早期版本的MySQL软件,请参阅相应的手册。例如,MySQL 5.7参考手册涵盖5.7系列MySQL软件版本。 由于本手册可作为参考,因此不提供有关SQL或关系数据库概念的一般说明,它也没有教你如何使用你的操作系统或命令行解释器。 MySQL数据库软件正在不断发展,参考手册也经常更新。 MySQL的源代码本身包含使用Doxygen编写的内部文档,生成的Doxygen内容是https://dev.mysql.com/doc/ind...。 如果你对使用MySQL有疑问,请加入MySQL Community Slack,或在论坛中提问。 上一篇:前言

July 5, 2019 · 1 min · jiezi

MySQL™-参考手册语法约定

语法约定当显示要在特定程序内执行的命令时,命令前面显示的提示符指示要使用哪种命令。例如,shell>表示从你登录的shell执行的命令,root-shell>类似,但应该以root身份执行,mysql>表示从mysql客户端程序执行的语句: shell> type a shell command hereroot-shell> type a shell command as root heremysql> type a mysql statement here在一些区域中,可以将不同的系统彼此区分开以表明命令应该在两个不同的环境中执行,例如,在处理复制时,命令可能以master和slave为前缀: master> type a mysql command on the replication master hereslave> type a mysql command on the replication slave here“shell”是你的命令解释器,在Unix上,这通常是一个程序,如sh、csh或bash。在Windows上,等效程序是command.com或cmd.exe,通常在控制台窗口中运行。 输入示例中显示的命令或语句时,请不要键入示例中显示的提示。 数据库、表和列名称通常必须替换到语句中,为了说明这种替换是必要的,本手册使用db_name、tbl_name和col_name,例如,你可能会看到如下语句: mysql> SELECT col_name FROM db_name.tbl_name;这意味着如果你要输入类似的语句,你将提供自己的数据库、表和列名称,可能是这样的: mysql> SELECT author_name FROM biblio_db.author_list;SQL关键字不区分大小写,可以用任何字母大小写,本手册使用大写。 在语法描述中,方括号(“[”和“]”)表示可选的单词或子句,例如,在以下语句中,IF EXISTS是可选的: DROP TABLE [IF EXISTS] tbl_name当语法元素由许多备选项组成时,备选项由竖线(“|”)分隔,当可以选择一组选项中的一个成员时,备选项列在方括号内(“[”和“]”): TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)当必须选择一组选项中的一个成员时,备选项将列在大括号内(“{”和“}”): {DESCRIBE | DESC} tbl_name [col_name | wild]省略号(...)表示省略了语句的一部分,通常是为了提供更复杂语法的更短版本。例如,SELECT ... INTO OUTFILE是SELECT语句形式的简写,在语句的其他部分后面有一个INTO OUTFILE子句。 ...

July 5, 2019 · 1 min · jiezi

MySQL™-参考手册前言

前言这是MySQL数据库系统8.0版到8.0.19版的参考手册,MySQL 8.0的次要版本之间的差异在本文中提到了版本号(8.0.x),有关许可证信息,请参阅法律声明。 由于MySQL 8.0和以前版本之间存在许多功能和其他差异,因此本手册不适用于旧版本的MySQL软件,如果你使用的是早期版本的MySQL软件,请参阅相应的手册,例如,MySQL 5.7参考手册涵盖5.7系列MySQL软件版本。 许可信息 — MySQL 8.0。本产品可能包括第三方软件,在授权下使用。如果你使用的是MySQL 8.0的商业版本,有关许可信息,请参阅MySQL 8.0 Commercial Release许可信息用户手册,包括可能包含在本商业版本中的与第三方软件相关的许可信息。如果你使用的是MySQL 8.0的社区版本,有关许可信息,请参阅MySQL 8.0社区发布许可信息用户手册,包括可能包含在本社区版本中的与第三方软件相关的许可信息。 许可信息 — MySQL NDB Cluster 8.0。如果你使用的是MySQL NDB Cluster 8.0的社区版本,有关许可信息,请参阅MySQL NDB Cluster 8.0社区发行许可信息用户手册,包括可能包含在本社区版本中的与第三方软件相关的许可信息。 文档可访问性有关Oracle对可访问性的承诺的信息,访问Oracle Accessibility Program网站http://www.oracle.com/pls/top...。 访问Oracle支持已购买支持的Oracle客户可通过My Oracle Support获得电子支持,有关信息,请访问http://www.oracle.com/pls/top...或如果你有听力障碍,请访问http://www.oracle.com/pls/top...。 上一篇:MySQL™ 参考手册(目录)下一篇:关于本手册

July 5, 2019 · 1 min · jiezi

Scrum會議太多了-你的團隊在Scrum活動中使用了多少時间

Scrum事件 - 會議太多了,太耗時了!!!我们究竟化了多少间?幾乎每一個我將Scrum引入新公司的團隊都曾在某些方面抱怨Scrum會議的持續時間。我得到的評論如下: “Scrum會議太多了”“什麼?兩個星期衝刺的四小時計劃會議!“”我們在這裡舉行了很多會議,現在你們正在通過更多的會議來殺死我們“”我不能讓我的團隊花費這麼多時間參加會議“”我太忙了“以下是Scrum中的事件以及每個事件的小時數: 新手團隊可能會看到這些數字在每個事件中都有大量的時間,但是如果您遵循檢查原則並實際深入了解時間; 你可能會對一些數字感到有些驚訝。 出於數學目的,我將假設平均上午9點到下午5點的工作,工作時間為8小時。我還將承擔週一至週五的工作,因為這在我與之合作的所有團隊中都很常見。 以下是Sprint中每個事件花費的時間細分: 2%的回顧團隊應該花時間檢查他們的流程和實踐,並尋求更好,更快地做事的機會。沒有這種檢查和精神,適應就完全喪失,敏捷的本質不存在。 2.5%的評論和反饋在衝刺結束時,團隊與利益相關者交談並尋求他們對剛剛完成的工作的反饋非常重要。這種風險管理策略通過允許團隊展示他們建立的內容以及利益相關者同意或糾正它來幫助儘早糾正錯位目標。不花時間做這些反饋只會導致錯誤的產品交付給利益相關者,而不是他們的期望。這通過定期反饋支持對增量和迭代開發的整體信念。 接下來是審查即將開展的工作,並允許產品負責人向團隊和利益相關者展示工作管道的健康狀況。它有助於透明地溝通產品,項目和即將開展的工作。 2.5%協調每日Standup每天,團隊只需要一個15分鐘的活動來計劃誰在接下來的24小時內做什麼,直到下一個每日Scrum。 5%規劃和設計最大的Scrum活動是規劃下一個sprint,並就如何處理工作進行高級設計。傳統開發團隊在規劃和設計方面花費了更多精力,而Scrum團隊完全減少了這一點。然而,這一事件是最具爭議性的事件,可能團隊認為這5%時间仍然很長。我個人不認為要求任何團隊有5%的時間來計劃和設計即將開展的工作是一個很大的問題。當然,專業人士應該能夠認識到計劃的重要性。 88%工作時间明显我们还有大比率時間去工作。這是一些更多的事實如下: 會議每天1小時(平均) 如果你把它看作平均每天只有一個小時的會議,是多是少见仁见智吧。 時間盒 時間框是事件的最長建议時間,這意味著如果您可以更快地地它们完成,只要能同時提供相同的質量; 那麼請快點完成它。 如果你的會議次數多於Scrum會議,那麼你做錯了,組織的功能失調需要解決。示例計算

July 4, 2019 · 1 min · jiezi

MySQL入门排序

MySQL 排序我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪中方式来进行排序,再返回搜索结果。 语法以下是 SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据: SELECT field1, field2,...fieldN table_name1, table_name2...ORDER BY field1, [field2...] [ASC [DESC]]你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。你可以设定多个字段来排序。你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。 你可以添加 WHERE...LIKE 子句来设置条件。 在命令提示符中使用 ORDER BY 子句以下将在 SQL SELECT 语句中使用 ORDER BY 子句来读取MySQL 数据表 runoob_tbl 中的数据:实例尝试以下实例,结果将按升序及降序排列。 mysql> use OPENKETANG;Database changedmysql> SELECT * from openketang_tbl ORDER BY submission_date ASC; +-----------+---------------+---------------+-----------------+ | openketang_id | openketang_title | openketang_author | submission_date | +-----------+---------------+---------------+-----------------+ | 3 | 学习 Java | OPENKETANG.COM | 2015-05-01 | | 4 | 学习 Python | OPENKETANG.COM | 2016-03-06 | | 1 | 学习 PHP | 阿里云大学 | 2017-04-12 | | 2 | 学习 MySQL |阿里云大学 | 2017-04-12 | +-----------+---------------+---------------+-----------------+4 rows in set (0.01 sec) mysql> SELECT * from openketang_tbl ORDER BY submission_date DESC; +-----------+---------------+---------------+-----------------+| openketang_id | openketang_title | openketang_author | submission_date | +-----------+---------------+---------------+-----------------+ | 1 | 学习 PHP | 阿里云大学 | 2017-04-12 | | 2 | 学习 MySQL | 阿里云大学 | 2017-04-12 | | 4 | 学习 Python | OPENKETANG.COM | 2016-03-06 | | 3 | 学习 Java | OPENKETANG.COM | 2015-05-01 | +-----------+---------------+---------------+-----------------+ 4 rows in set (0.01 sec)读取 openketang_tbl 表中所有数据并按 submission_date 字段的升序排列。 ...

July 4, 2019 · 2 min · jiezi

MySQL下的DB-Link

前言: 在实际工作中,我们可能会遇到需要操作其他数据库实例的部分表,但又不想系统连接多库。此时我们就需要用到数据表映射。如同Oracle中的DBlink一般,使用过Oracle DBlink数据库链接的人都知道可以跨实例来进行数据查询,同样的,Mysql自带的FEDERATED引擎完美的帮我们解决了该问题。本篇文章介绍FEDERATED引擎的开启和使用。 1.开启FEDERATED引擎若需要创建FEDERATED引擎表,则目标端实例要开启FEDERATED引擎。从MySQL5.5开始FEDERATED引擎默认安装 只是没有启用,进入命令行输入show engines; FEDERATED行状态为NO。 mysql> show engines;+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine | Support | Comment | Transactions | XA | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO || MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO || CSV | YES | CSV storage engine | NO | NO | NO || BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO || MyISAM | YES | MyISAM storage engine | NO | NO | NO || InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES || ARCHIVE | YES | Archive storage engine | NO | NO | NO || MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO || FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+9 rows in set (0.00 sec)在配置文件[mysqld]中加入一行:federated,然后重启数据库,FEDERATED引擎就开启了。 ...

July 4, 2019 · 5 min · jiezi

PHPOAOA的成功要素服务篇

一直以来,OA办公系统厂商的服务是用户能否成功使用产品的关键,从而服务也成为衡量OA办公系统厂商实力的因素之一。优质的OA办公系统厂商为了保障产品的成功应用,也会努力为用户提供完善的服务。 这几年,业界讨论最激烈的话题之一是:如何将协同oa的价值做到最大化?针对这个问题,PHPOA系统的市场总监陈先生给出了自己的答案,那就是:只有用服务的精神贯穿软件的应用,才能真正体现出协同管理软件的价值。 在PHPOA系统的市场总监陈先生看来,如今各行各业均趋于服务化,软件也同样如此。而OA办公系统应用效果的好坏,主要取决于后期的维护过程,一方面是企业自身的使用,另外后期服务也至关重要。服务主要从几方面考量,比如是否能够及时解决用户问题、是否能提供专业的咨询与售后等。 为此,PHPOA还提供了针对性极强的定制服务,根据客户的具体办公模式,PHPOA会与客户共同分析办公流程和其中的数据逻辑变化,以及特殊商业规则,把这些具有行业特征、个性化的管理功能进行定制化开发,为客户提供完全符合管理需求的OA办公系统。 在产品的整个实施、使用过程中,PHPOA的系统工程师都能够为客户在线提供咨询服务,包括对系统的使用、对新系统分析,对现有系统的调整等,甚至还包括指导系统管理员进行系统规划、定制和实施,以便更好、更灵活地发挥系统功能优势和特点,从而协助系统管理员诊断各种故障,制定维护和故障处理方法。 陈先生介绍说,为了全方位的保障用户用好OA系统,他们还构建了“五八六三”管家式服务体系,包括“五心”服务精神、八项服务承诺、六大服务内容、三级服务体系等。 长期以来,国内管理软件服务费难收,貌似已经成为一个相当普遍的问题。对此,陈先生认为,在国外,卖软件就是卖服务的观点已经获得广泛的认同,国外的软件厂商主要以收取服务费的方式获取利润。而在国内,想让OA办公系统厂商依靠服务费来生存,显然还不现实。但是,卖软件就是卖服务这一核心理念是OA办公系统的内在本质依然没有变化。 正是因为对服务的重要性有着清晰的认识,PHPOA自成立以来就致力于为客户提供更高层次的服务,通过为客户提供深层次、全方位的信息化服务,包括为客户提供满足企业发展需要的各种解决方案和软件产品,为客户提供咨询、分析、测试、开发等全方位服务,并以PHPOA数据平台为中心,构建客户综合性信息化管理系统。 如今,除了为用户提供可用的产品外,OA办公系统厂商在服务上的 “软”能力越来越成为企业选型时着重考量的因素。在创新不断、追求效率的今天,片面的技术能力已经不再能打动企业,OA办公系统厂商优秀的服务理念及服务内容,才是帮助用户用好oa的关键点。

July 4, 2019 · 1 min · jiezi

PHPOA协同软件开放性是OA办公的终极目标

随着客户的办公化需求的深入和拓展,oa已经逐渐成为一个综合性的协同办公和管理平台。站在用户的角度,小编要提醒的是,一个成熟先进的企业OA办公系统需要有良好的扩展性和二次开发能力,能够满足后续企业变化的需求、深入和长久的使用。 对此,PHPOA系统的品牌负责人深表赞同。在他看来oa满足开放性的要求,不仅意味着企业oa管理系统可以独立于硬件、操作系统,系统开发建设中能够获得更多的技术支持,容易升级,而且开放的系统结构可以和企业已有的信息资源集成。产品的开放性好,则意味着一旦企业的需求发生变化,系统能够尽快的得到扩充,原有的投入得到有效的保护,从而在整体上得到良好的投入产出效益。 PHPOA软件!专业oa办公软件开源服务提供商,采用php+mysql开源语言,一直致力于应用管理软件基层研发,现己推出企业、集团、saas等应用平台!而且,PHPOA企业运营管理平台还能通过增减功能模块,让购买系统的价格进行调整,来满足不同企业的办公需求。 但在实际应用中,企业OA系统的开放性可以说是最容易被忽略的,一般用户也不会深入了解到产品的不足和根据自身的后续调整,而且OA办公系统厂商通常不会主动提及这些问题,只是简单的承诺一些表面上的服务和支持。当OA系统需要深入使用,并进行功能扩展时,而oa不能满足就为时过晚了。 这就需要用户在oa选型过程中对开放性有更多的重视。但接下来就有一个问题,那就是用户真正需要什么样的oa开放性?这一点,其实很多用户心中也没有谱。PHPOA在积累了诸多成功经验之后,对优质的OA办公系统开放性给出了以下总结: 首先,OA产品要做到敏捷开发,可根据用户需求实现敏捷开发和动态部署,最大限度的降低开发周期和费用; 其次,OA产品要是一个活的系统,成为一个可生长的协同办公平台,动态适应未来的升级和变化,保证企业的长期投资价值。

July 4, 2019 · 1 min · jiezi

通过自研数据库画像工具支持去O数据库评估

“去O”,是近些年来一直很火的一个话题,随之也产生了各种疑惑,包括现有数据库评估、技术选型等。去O是项系统工程,需要做好充分的评估。本文通过自研工具,生成数据库画像,为去O评估提供一手数据,希望给大家带来借鉴。 一、常见疑惑很多公司在考虑去O的时候,经常面临这样的问题—"对自己的数据库不够了解",也不免有这样一些疑惑: [管理者] 数据库去O成本高嘛?工作量大不大?工期长吗?是否存在什么风险?[架构师] 使用MySQL能承载现有业务规模嘛?是否有什么技术风险?是否需要引入分库分表嘛?是否需要引入缓存嘛?研发复杂度高嘛?需要投入多大工期?数据访问特征如何?迁移前后对比数据量大吗?[开发者] 复杂SQL多嘛?改造量是不是很大?是不是使用Oracle方言、专有对象,需要改造?等等面对上面这些问题,就需要快速了解现有Oracle的对象、语句、访问特征、性能表现等,并据此评估技术方案、迁移方案以及后续的工作量等。也就是说,需要给我们的数据库进行“画像”。基于上面的数据库画像,对去O工作全周期进行指导,包括以下方面都将大有裨益: 决策阶段:整体难度、成本(人财时)、技术风险架构阶段:技术方案、对象结构、性能评估研发阶段:兼容性、复杂度、测试迁移阶段:结构迁移、数据迁移、数据校验正是基于此类需求,有些公司推出评估产品,例如阿里的数据库和应用迁移服务(简称 ADAM),但此类产品往往需要部署agent,上传分析包等,对于安全比较敏感的企业不太可行。我所在的公司在两年前启动去O工作时,也面临此问题。故特意开发个绿版小程序,可在本地运行,方便评估工作。 地址:https://github.com/bjbean/ora... 二、设计思路收集并汇总 Oracle 数据库信息,包含环境、空间、对象、访问特征、资源开销及SQL语句等六方面信息,全面覆盖数据库实际运行状况。为信息收集更有针对性,工具通过参数设置部分阈值。通过运行命令行,收集信息后生产WEB版评估报告,以可视化的方式直观体现出来。不仅可作为去O评估依据,亦可作为后续改造的数据参考。 三、画像解读下面针对报告数据进行解读,并对常见的去O选型-MySQL进行说明。 3.1 概要信息图1 显示收集的目标的概要信息,包括IP、实例、用户等。需注意分析时间,脚本会提取数据库执行特征(24小时内),因此建议在业务高峰之后运行。 3.2 空间信息图2 空间大小是数据库选型需重点考虑的指标之一,也会影响到后续迁移。如库规模较大,应考虑做分拆处理。拆分的原则就是尽量控制单库规模。一般可遵循如下拆分优先原则: 1)业务层垂直拆分在应用层面,将数据按照不同的业务条线进行拆分。例如电商平台中按照订单、用户、商品、库存等拆分。各自拆分的部分,业务内聚,无强数据依赖关系。 2)业务层水平拆分在同一业务内部,对数据建立生命周期管理,进行数据冷热分层。针对不同层的数据访问特点不同,可做进一步拆分。例如电商平台中,针对订单可分为活跃订单(二周内,可退换货)、非活跃订单(二周至半年期,客服可受理)、历史订单(半年以上)。 3)应用层分库分表若经过上述拆分单个库的规模仍然较大,可考虑使用分库分表技术。通常的做法是引入数据库中间层,逻辑上虚拟出一个数据库,但物理上划分为多个数据库。这是一种不太“优雅”的方案,因为很难做到应用透明。也就是说,必须在研发方面有所妥协,牺牲一部分数据库能力。常见技术方案上可分为:Client、Proxy、SideCar三类,现多推荐使用Proxy模式(容器部署可考虑SideCar模式)。 4)基础层分布式数据库较“分库分表”方式更为彻底的是直接使用分布式数据库。它提供了一种可承载更大规模(容量、吞吐量)的解决方案。近些年来,分布式数据库已逐渐成熟,推广落地;并开始在关键场景中尝试使用。 3.3 对象信息图3 针对Oracle中对象,在改型中各有不同的考虑要点。报告中给出汇总数据,也可给出明细数据方便查询。 1)表表的数量过多,直接影响数据字典大小,进而影响数据库整体效率。从MySQL来看,还需考虑文件句柄等问题。这一指标没有一定之规,需根据情况酌情考虑。这里更多是数据架构层面考虑,避免单库数据表过多。曾经历过单库10万张表,性能低下;优化后整合成2万张的优化案例。如选择MySQL,建议单库不超过5000张表;库*表的总数不超过20000。 2)表(大表)控制单表的规模,是设计的要点之一,直接影响到访问性能。表过大,应考虑采用上面的原则进行拆分。表大小没有通用原则,这里可通过参数进行配置。可按照物理大小或记录数两个维度设置。这里的关键点在于表的访问方式,如均为简单的kv型访问,规模大些还好;如访问比较复杂,则建议阈值设置更低些。如选择MySQL,大表复杂查询或多表关联等均不是其擅长场景,可考虑使用ES、solr+hbase等方式异步处理复杂查询。 3)表(分区表)从9i、10g以来,Oracle的分区功能日趋完善、功能增强。可以说已成为Oracle应对海量数据的利器。但对于MySQL来说,仍然不太建议使用分区功能。一方面,随着硬件能力的增强,单表可承载力变大;另一方面,MySQL使用分区还需面对“DDL放大”、“锁变化”等问题。如果团队可以很好地驾驭数据库中间层,还是建议使用复杂度更低的分表技术。这也许会稍许增加研发量,但对运维来说,好处多多。 4)字段(大对象)在任何数据库中,都不建议使用大对象。如果你用了,趁着改造工作,赶紧去掉吧。大对象功能对数据库来说,就是鸡肋。数据库自身的ACID能力,应着力保存更为重要的数据。 图4 5)索引(B树)索引过多会影响DML效率、占用大量空间。可通过“索引/表”,大致反应出索引数量的合理程度。这里没有建议的数值,可根据情况酌情考虑。对于任何数据库来说,都有类似的问题,就是如何“构建战略性索引策略”。这里可参考下表(选自李华植-《海量数据库解决方案》一书),梳理索引需求。科学地创建、维护索引。 6)索引(其他)Oracle除了通常的B+树索引外,还支持其他类型的索引。如选择其他数据库,那么这些索引都需要改造,通过其他方式实现。 7)视图视图,作为SQL语句的逻辑封装,在某些场景下(如安全)很有意义。不过它对于优化器有较高要求,Oracle在这方面做了很多工作(可参看作者写的《SQL优化最佳实践》一书)。而对于MySQL,则不建议使用,考虑改造。 8)触发器/存储过程/函数对于数据库来说,承载了计算、存储两类能力。作为整个基础架构部分最难扩展的组件,尽量发挥数据库的核心能力很重要。相较于存储能力而言,计算能力是可通过应用层解决,而应用层又是往往容易扩展的。此外,考虑到未来的可维护性、可迁移性等因素,这部分考虑在应用端解决吧。 图5 9)序列Oracle中的序列,可提供递增的、非连续保障序号服务。在MySQL中有类似的实现,是通过自增属性来完成。这部分应该可以做迁移,但如果并发量非常大;亦可考虑使用发号器的解决方案。 10)同义词同义词是数据耦合的表现,无论在什么数据库,都应该摒弃掉。应考虑在业务端进行拆分,不再依赖于这种特性。 3.4 访问特征图6 这里收集了,在过去的24小时内数据库中DML次数最多的Top20。这直接地反应出当前系统的操作的“热点”对象。这些对象都需要在选型之后、迁移之前重点评估其性能表现。能考虑分拆、缓存等手段,均可减低这些对象的热点压力。不仅局限于这些对象,更建议的是建立“业务压力模型”。通过对业务充分的了解和评估后,将业务逻辑抽象出来,转化为数据压力模型。此处的难点在于对业务逻辑的抽象能力及对模块业务量的比例评估。 形成类似下面的伪代码: 图7 可依据上述伪代码,编制压力测试代码。通过一些工具调用测试代码,产生模拟测试的压力。这对于系统改造、升级、扩容评估、新硬件选型等均有意义。在具体去O工作中,新技术方案是否满足需要,可通过此方法进行评估验证。更多用业务的语言,来对比去O前后的承载力变化。这也是决策技术方案是否可行的考虑因素之一。当然上述信息,只包括了DML,对查询部分是不包含的,可以从Oracle AWR中获得这些数据。更为完整的,可以考虑结合应用做全链路的压测。 3.5 资源消耗图8 这里列出了最近24小时的资源使用情况。这些数据主要有两个目的: 1)评估整体负载因为上述指标是Oracle的度量显示的,无法直接类比到其他数据库。可以凭借专家经验+历史数据,评估负载压力。用于对其他备选技术方案进行评估的依据之一。这其中的有些指标(例如user calls等),可以转化为量化指标指导后续测试等工作。 2)评估瓶颈点对于某项指标非常突出的情况,那说明现有业务也有瓶颈,在迁移至其他方案时尽量在设计阶段就予以考虑,并在测试环节重点关注,减少可能的技术风险。 3.6 SQL语句图9 SQL语句的改写,是整个迁移工作中最为头疼的部分。除非是完全重构,否则是需要关注SQL改写的工作任务。这里面涉及到改写量、复杂度、性能对比等诸多内容,很多还是需要人工甄别完成。 笔者曾经有过这样的经验,项目组花1个月的时间就完成某项目的“结构+SQL”的迁移工作,但是后续又花费了3个月的时间完成语句优化、甚至结构调整。其原因是迁移上线后语句无法满足性能需求。而这是在边上线、边调整,过程异常痛苦。因此早期查明现有SQL情况,对于评估工作量、改写难度、性能评估,有着重要的意义。而上面这部分就是收集了分析用户在历史的所有SQL(可以打开明细开关,显示全量SQL),其包含了以下这些维度。 1)总SQL数该指标可近似反映业务繁忙程度。此外,也可用于后续有问题语句的比例分析基础。 2)超长SQL这里列出了超过指定字符数的语句,阀值在可通过参数进行配置。如果是考虑MySQL,建议使用“短小精悍”的SQL,面对复杂SQL则一般表现不佳。那么对于这些超长的语句,都是值得关注的对象,起码是容易出现问题的语句。 3)ANTI SQL反向查询,数据库处理上都较为困难,这部分也比较考验优化器。虽然在MySQL的较新版本中,对反向查询有了不错的优化,但这部分仍然值得关注。 4)Oracle Syntax SQL有Oracle特征的写法,即Oracle的方言(例如特有函数、伪列等),这些都是需要在迁移中进行处理的。当然现在也有的厂商,宣布其产品是兼容Oracle语法的,但也建议针对这些做专门测试。 5)Join 3+ Table SQL多表关联,也是比较考验优化器。特别是MySQL表间关联效率偏低,不建议使用超过2个以上表的关联。这里列出的是3个及以上的关联查询,需要考虑修改。针对特别复杂的查询,可以考虑将其卸载到大数据平台完成。 ...

July 4, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb一个集群里可以安装多个SAC吗

【问题详细描述】 一个集群可以同时安装两个SAC吗? 【解决方法】 1、可以,但是一般是一个 SAC; 2、一个集群安装多个SAC需要做特殊处理,假设有机器A和B,可以先在 A 上用 SAC 部署集群,包括 B 机器上的节点。然后再在 B 机器的 SAC 上发现集群。这样就能在两个 SAC上访问同一个集群了。 发现业务操作,详细介绍可见: http://doc.sequoiadb.com/cn/i... 【解决方法】 1、可以,但是一般是一个 SAC,一个SAC可以管理sdb集群中所有实例以及所有pgsql和mysql实例; 2、一个集群可以安装多个SAC,但是不推荐,如果需要安装多个SAC,需要做特殊处理,假设有机器A和B,可以先在 A 上用 SAC 部署集群,包括 B 机器上的节点。然后再在 B 机器的 SAC 上发现集群。这样就能在两个 SAC上访问同一个集群了。 发现业务操作,详细介绍可见: http://doc.sequoiadb.com/cn/i...

July 4, 2019 · 1 min · jiezi

巨杉数据库Sequoiadblzw和snappy压缩分别应用在什么场景

【问题描述】 lzw和snappy压缩分别应用在什么场景比较合适? 【解决办法】 snappy 压缩算法是以单条记录为单位进行压缩,记录内部的数据重复读直接影响到压缩率。因此,当记录内部数据重复度较高,如每条记录的字段名、字段值相似,使用 snappy 算法可获得良好的压缩性能。如果记录内部数据重复度很低,但记录间具有更好的相似性,如不同记录之间有相同的字段名、相近的字段值等,则使用 lzw 算法更优。

July 4, 2019 · 1 min · jiezi

MySQLMariaDB-语句速查笔记

平时实际开发的时候,其实并不太依赖 MySQL 作为 关系型数据库 中的 “关系” 这一属性,更多地只是把 MySQL 作为数据存储的介质。因此 MySQL 语句其实很少写,所以本文用于记录一些 MySQL 在常规数据操作中的常用语法,备查。少用或者不用的知识就不列了。 本文地址:https://segmentfault.com/a/1190000019659700 基础 CURDCreate,添加数据INSERT INTO 表名 (列名, 列名, ...)VALUES (值, 值)Update,更新数据UPDATE 表名 SET 列名=值, 列名=值, ...WHERE 条件 ...Read,读取基本操作SELECT 列名, 列名, ... WHERE 条件 ...获取数据并去掉重复项SELECT DISTINCT 列名, 列名, ... WHERE 条件 ...Delete,删除DELETE FROM 表名 WHERE 条件 ...Find or Create 逻辑这是一个很实际的需求,业务需要依据条件获取一个条目,如果不存在,则创建该条目。如果用 select + insert 组合,那么这个操作并不原子。理想情况下是使用 UNIQUE,但很多时候并不行。那么可以采用以下的语句: INSERT INTO 表名 (列名1, 列名2, 列名3, ...)SELECT * FROM (SELECT 值1 AS 列名1, 值2 AS 列名2, 值3 AS 列名3, ...) AS tmpWHERE NOT EXISTS ( SELECT id FROM 表名 WHERE 条件 ...) LIMIT 1数据表操作、调整获取表信息desc 表名获取表创建语句show create table 表名添加字段# 非空、带默认值:ALTER TABLE 表名 ADD 列名 数据类型 NOT NULL DEFAULT 默认值 COMMENT 注释# 不带默认值:ALTER TABLE 表名 ADD 列名 数据类型 COMMENT 注释# 指定添加字段的位置ALTER TABLE 表名 ADD 列名 数据类型 COMMENT 注释 AFTER 前一列名修改字段# 修改字段类型ALTER TABLE 表名 MODIFY 列名 数据类型 ... # 后面的 ... 需要和前面添加字段的 “数据类型” 后面的那些项一致# 修改字段名ALTER TABLE 表名 CHANGE 列名 新列名 数据类型 ...MySQL 常用数据类型整型数值tinyint:相当于 int8_tsmallint:相当于 int16_tint:相当于 int32_tbigint:相当于 int64_t,建议用 bigint 存 timestamp 类型上述四种数据,可以加上 unsigned 表示无符号数,比如 tinyint unsigned 相当于 uint8_t定义整型数值时,可以在后面加上括号,写一个数字,如 int(11),这个数字仅仅表示显示长度(十进制),不影响实际数据位宽。 ...

July 4, 2019 · 1 min · jiezi

Mysql索引优化一索引类型

索引对于良好的性能非常关键,尤其是在数据量越来越大的时候。恰当的索引对性能的帮助是非常巨大的,不恰当的索引不禁不能对性提升有帮助,当数据量达到一定级别的时候还可能造成性能的下降。所以了解索引对Mysql性能优化有着至关重要的作用。Mysql索引基本类型有 B-Tree,哈希索引,全文索引,空间数据索引(R-Tree)。其中B-Tree、哈希、全文索引是我们经常用到的。 B-Tree索引B-Tree索引是我们口中经常说的索引类型(有些存储引擎中使用的是B+Tree。如InnoDB)。每个引擎对于BTREE索引使用方式是不一样的。如 MyISAM引擎使用的是前置压缩技术,这样索引会变的很小。而InnoDB则是按照原有的数据格式来存储的。MyISAM索引是通过数据的物理位置来找到被索引的行,而InnoDB则是根据被索引的行的主键来找到被索引行的。B-Tree索引的所有值都是按顺序存储的,并且每个叶子节点到根节点的距离是相同的。下面给出一个简单的示意图 假设有下表: CREATE TABLE student( first_name varchar(20) not null, last_name varchar(20) not null, age tinyint(3) not null, created_at timestamp not null, key(first_name ,last_name));可以使用到B-Tree索引的查询 全值匹配 全值匹配指对索引中的所有列进行匹配。如查询姓名是 zhang san的人 select * from student where first_name='zhang' and last_name='san'; 这里使用了索引的第一列与第二列匹配最左前缀,如查询姓为张的人 select * from student where first_name='zhang' ;这里使用了索引的第一列匹配列前缀,也可以值匹配某一列的开头部分,如 select * from student where first_name='zha' ;这里使用了索引的第一列匹配范围值,如 select * from student where first_name>'bao' and first_name<'zhang';这样也会使用到索引的第一列只访问索引的查询,如果查询条件是 select first_name,last_name from student where first_name='zhang' ;那么查询就只会访问索引,而不会再去根据主键回表查询数据。这里需要注意的是;B-Tree 索引需要根据最左前缀查询,如果不是按照索引的最左列开始查询,那么是不会使用到索引的。例如:select * from student where last_name='san';select * from student where first_name like '%ha%'; 这样的sql是没办法命中索引的。对于第二条sql如果需要使用索引,那么应该改为 select * from student where first_name like 'ha%';哈希索引哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才会使用到索引,只有Memory引擎才支持哈希索引。假设有下表: ...

July 3, 2019 · 1 min · jiezi

mysql-触发器

mysql 触发器的实现代码-- Created by util.you.com@gmail.com-- 声明变量,用于存入 CXY_TS_ORDER_TICKET 表的 get_status 字段值,id 字段值-- 分别给 s1 和 s2 赋值delimiter $$CREATE TRIGGER `order_ticket_status_trigger` AFTER UPDATE ON `CXY_TS_ORDER_TICKET` FOR EACH ROW BEGIN DECLARE s1 INT(11); DECLARE s2 INT(11); set s2 = new.id; set s1 = new.get_status; IF((old.get_status != new.get_status) OR (old.get_status IS NULL && new.get_status IS NOT NULL)) THEN INSERT INTO `CXY_TS_ORDER_TICKET_STATUS`(`order_ticket_id`, `STATUS`, `insert_date_time`) VALUES(s2, s1, DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s')); END IF; END$$

July 3, 2019 · 1 min · jiezi

MySQL数据库高可用集群搭建-PXC集群部署

Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上。 PXC原理描述: 分布式系统的CAP理论:C:一致性,所有的节点数据一致A:可用性,一个或者多个节点失效,不影响服务请求P:分区容忍性,节点间的连接失效,仍然可以处理请求其实,任何一个分布式系统,需要满足这三个中的两个。PXC的优点:1)服务高可用;2)数据同步复制(并发复制),几乎无延迟;3)多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让galera解决数据冲突;4)新节点可以自动部署,部署操作简单;5)数据严格一致性,尤其适合电商类应用;6)完全兼容MySQL; 一些名词介绍: WS:write set写数据集,写/更新事务IST:Incremental State Transfer 增量同步SST:State Snapshot Transfe 全量同步。 SST支持的方法有:mysqldump,rsync ,xtrabackup 。mysqldump,rsync同步需要READ LOCK, (SST applies FLUSH TABLES WITH READ LOCK command) xtrabackup 在整个同步数据过程中不需要READ LOCK。 配置参数:wsrep_sst_method=xtrabackup-v2UUID:节点状态改变及顺序的唯一标识GTID:Global Transaction ID,由UUID和sequence number偏移量组成。wsrep api中定义的集群内部全局事务id,用于记录集群中发生状态改变的唯一标识以及队列中的偏移量。WSRWP API:在DBMS库和wsrep provider之间提供接口 PXC环境所涉及的端口: mysql实例端口:3306#PXC cluster相互通讯的端口:4567 #用于SST传送的端口:4444 #用于IST传送的端口:45681.有3个节点 pxc_node0 192.0.0.197 pxc_node1 192.0.0.198 pxc_node2 192.0.0.199 2.防火墙设置 01关闭防火墙 systemctl stop firewalld.service # systemctl disable firewalld.servie02或开启防火墙对应的端口: firewall-cmd --zone=public --add-port=3306/tcp --permanentfirewall-cmd --zone=public --add-port=4444/tcp --permanentfirewall-cmd --zone=public --add-port=4567/tcp --permanentfirewall-cmd --zone=public --add-port=4568/tcp --permanent ...

July 3, 2019 · 2 min · jiezi

MySQL-处理重复数据

有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。本章节我们将为大家介绍如何防止数据表出现重复数据及如何删除数据表中的重复数据。 防止表中出现重复数据你可以在MySQL数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。让我们尝试一个实例:下表中无索引及主键,所以该表允许出现多条重复记录。 CREATE TABLE person_tbl(first_name CHAR(20),last_name CHAR(20),sex CHAR(10));如果你想设置表中字段first_name,last_name数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为NULL,可设置为NOT NULL。如下所示: CREATE TABLE person_tbl(first_name CHAR(20) NOT NULL,last_name CHAR(20) NOT NULL,sex CHAR(10),PRIMARY KEY (last_name, first_name));如果我们设置了唯一索引,那么在插入重复数据时,SQL语句将无法执行成功,并抛出错。INSERT IGNORE INTO与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。以下实例使用了INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据: mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)-> VALUES( 'Jay', 'Thomas');Query OK, 1 row affected (0.00 sec)mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)-> VALUES( 'Jay', 'Thomas');Query OK, 0 rows affected (0.00 sec)INSERT IGNORE INTO当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而REPLACE INTO into如果存在primary 或 unique相同的记录,则先删除掉。再插入新记录。另一种设置数据的唯一性方法是添加一个UNIQUE索引,如下所示: ...

July 3, 2019 · 1 min · jiezi

Scrum的五个价值观勇气-承诺-尊重-专注和开放

Scrum的五个价值观:勇气,承诺,尊重,专注和开放。了解自组织首先要了解这些价值观是如何融入您的项目中的实际事物: 每个人都致力于项目的目标当团队有权做出决策以实现这些目标时,可以实现这种承诺水平,每个人都对项目的计划和执行方式有发言权。第3章中的电子书阅读器团队最初被要求建立一个互联网店面。为了使产品成功,他们不得不忽略这一要求,以便提供更有价值的项目。这是唯一可能的,因为他们被允许做出这个决定 只有团队,Scrum Master和产品负责人。他们不需要通过官僚机构来完成任务。 团队成员互相尊重当团队成员相互尊重时,他们能够相互信任,以完成他们所做的工作。但对于程序员和其他技术人员而言,这种尊重并不总是那么容易。许多程序员,尤其是高技能程序员,往往纯粹基于技术能力。这可能是有效采用Scrum的障碍。如果程序员不尊重产品负责人,他在谈论项目目标时不会听取产品负责人的意见。 一个优秀的Scrum Master会找到方法来增加团队成员之间的相互尊重。例如,他可以向程序员展示产品负责人对用户的思考方式以及公司需求有深刻的理解。随着程序员开始了解该知识如何对项目成功有用,他们开始重视并尊重产品负责人的意见。 每个人都专注于工作当Scrum团队成员正在进行sprint工作时,这是他在sprint 期间唯一的工作。 他可以自由地完成完成sprint积压所需的任何工作,并处理sprint期间对该积压所做的任何更改。当每个团队成员专注于sprint目标并且可以自由地完成满足这些目标所需的任何工作时,整个团队能够组织自己并在需要变更时轻松地重定向。 另一方面,分心的团队是一个效率较低的团队。在现代工作场所中有一个神话,人们 - 特别是程序员 - 在多任务处理时工作得最好,因为他们可以在第一个项目被阻止时转移到第二个项目的任务。这不是人们在现实生活中的工作方式!在项目之间切换,甚至在同一项目中的不相关任务之间切换会增加意外的延迟和工作量,因为上下文切换需要大量的认知开销。放下你目前的工作需要花费大量的心理努力,然后从另一个项目的中心开始。你最终不得不回顾你上次做的事情,只是为了提醒自己你试图解决的问题。告诉团队成员切换到另一个项目上的任务不仅需要执行新任务所需的时间, 不买吗?试试这个思想实验。假设你有两个为期一周的任务。并假装通过物理定律的一些惊人的弯曲,多任务处理不会增加任何开销。您可以无缝地切换这些任务,而无需增加一秒的开销或延迟,因此这两项任务将花费两周的时间。即使在这些完美(和不可能)的情况下,多任务也没有意义。如果你没有多任务,你将在第一周结束时完成第一个任务,第二个任务在第二周结束时完成。但是,如果你执行多任务,那么你必须在第一周花费至少一些时间完成第二项任务,所以直到下周某个时候它才会完成。这就是为什么即使人类擅长多任务处理(我们也不是),这样做也没有意义。 多任务处理不是团队成员分心的唯一方式。他们经常被要求参加无用的会议和无关的委员会,开展与项目无关的活动,并为其他项目提供支持工作。一个好的Scrum团队被允许忽视这些分心而不冒他们的职业或晋升风险。24(现在必须完成的当前项目的支持工作可以添加到sprint backlog中 - 但是只有在取出其他东西才能使其适合时间框时。) 团队重视开放性当您在Scrum团队工作时,团队中的其他人应该始终了解您正在进行的工作以及如何将项目推向其当前目标。 这就是为什么基本Scrum模式中的实践旨在鼓励团队成员之间的开放性。例如,任务板允许每个人看到每个团队成员正在完成的所有工作,以及剩下多少工作要做。Burndown图表让每个人都可以自己测量sprint实现sprint目标的速度。每日Scrum在有效完成时,是一项几乎纯粹的开放式练习,因为每个人都分享他或她的任务,挑战和整个团队的进步。所有这些都可以帮助团队营造相互支持和鼓励的氛围。 为Scrum团队创造一种开放文化听起来很棒,也很积极,而且确实如此。但它通常是Scrum团队最困难的事情之一,因为它是Scrum价值观与公司先前存在的文化冲突的最常见方式之一。 许多公司都有一种不鼓励透明度的文化,并用一种依赖于不透明的严格等级来取而代之。建立这样一种文化的管理者可以通过多种方式从中受益。在一个不透明的组织中,告诉团队实现一个不切实际的目标(“我不关心你是怎么做的,只是完成它!”)会更容易,迫使团队加班加点来实现它。当球队不可避免地无法实现这一目标时,它会让经理对CYA有可能的拒绝(“这不是我的错,他们搞砸了!”)。 这就是为什么开放性和自组织通常是Scrum采用的不可触及的“第三轨”。这是使Scrum采用正确的一个核心概念,但它也要求公司以不同于过去的方式对待团队。接触发展的细节否定了不透明的经理人对CYA的掩护。许多初出茅庐的Scrum团队发现,一旦不透明的管理人员开始看到香肠是如何制作的,他们的采用工作就会受到影响。 开放性威胁着卡通,尖尖,不透明的经理。但实际上,即使是一支优秀的团队也很难采用。从开发人员的角度考虑开放性,开发人员被视为代码的一部分的专家,或者是计划的“守护者”的项目经理,或者是许多用户的唯一联系人的产品负责人关于软件内容的主要决策者。这些团队成员中的每一个都有权将这些事物视为对项目的贡献。将这些内容打开给团队是非常困难的,并且鼓励其他团队成员在未获得许可的情况下共享所有权并进行更改。 这是个人团队成员抵制开放的一种非常自然的方式。但是,当他们通过这个并分享所有权 - 包括在出现问题时的责任 - 与整个团队的所有这些事情,每个人都会受益,因为这是相互信任并快速提供更有价值的软件的唯一方式。 团队成员有勇气站出来参与该项目当你选择开放而不是不透明时,你会让团队变得更强大,而不是以牺牲团队为代价来强化自己。这样做需要勇气,但是当你这样做时,你最终会得到更好的产品和更好的工作环境。 Scrum团队有勇气通过有益于项目的价值观和原则来生活。要想避免价值与Scrum和敏捷价值观发生冲突的公司不断回击,需要勇气。这需要每个团队成员,特别是Scrum Master保持警惕。但它也要求每个人都愿意相信提供有价值的软件将有助于他或她克服对这些价值观的抵制。这也需要勇气,尤其是在与老板坐下来进行审查的时候。要对自己说,“帮助这个团队生产有价值的软件对我来说比对自己的个人贡献吹嘘权利更重要。” 那么你将如何在团队中建立勇气?您如何让团队相信自己,并相信Scrum不仅可以帮助他们构建更有价值的软件,而且他们的公司将看到他们新方法的价值? Agile & Scrum Basis Comprehensive Scrum GuideWhat are Scrum's Three Pillars?What is Agile Software Development?Scrum in 3 MinutesWhat are the 5 Scrum Values?What is the Evolution of Scrum?Classical Project Management vs Agile Project ManagementWhy is Scrum Difficult to Master?What is Velocity in Scrum?What is Agile? What is Scrum?What are the Three Amigos Development Strategy in Agile?Empirical Process Control vs Defined Process ControlHow to Maintain Transparency in Scrum?Scrum vs Waterfall vs Agile vs Lean vs KanbanWhat is 3355 in Scrum Framework?Why Scrum? How Does Scrum Overcome 8 Pain Points We Always face?The Best Free and Commercial Agile Tools - Every Scrum Team Needs!What are the 8 Wastes in Lean?Extreme Programming (XP) vs ScrumWhat is Timeboxing in Scrum?Agile Myth: Documentation and Planning not Needed?

July 3, 2019 · 1 min · jiezi

工作流新时代到来PHPOA在行业树立标杆

目前,商场上OA软件与日俱增,大多数已经不局限于工作流管理,功能也看起来日益俱全。在这样的情况下,OA办公系统相当于企业it系统的一个大杂烩,亦或是厂商所说的大协同平台。但是不少功能只是看上去很美,却对用户来说不太实用。不少OA办公系统厂商的发展路线其实是本末倒置了。 因为大而全的企业内部大平台,不是OA办公系统的职能,也不应成为oa功能宣传的口号。oa更应专注于工作流的管理,在此基础上进行适当的功能拓展,同时又可以与各个系统的数据进行相应整合,转向更加智能化和整合化发展。也就是说,评判OA办公系统优劣的关键仍在于工作流。这一点,国内知名OA办公系统厂商——PHPOA理解最为深刻。 一直以来,PHPOA办公系统的工作流管理是其最核心的优势,能支持七大流程类型,即固定流程、自由流程、自由顺序流程、分支流程、并发流程、半自由流程和无流程,基本满足了目前企业中管理制度、组织结构和人员岗位的各种变化所带来的各种复杂需求。但PHPOA对OA办公系统工作流管理的贡献不仅在于此,还在于创造性地提出工作流2.0概念,终结了OA办公系统1.0时代。 在很长一段时间,对工作流比较标准的定义是:业务过程的部分或整体在计算机应用环境下的自动化。这是一个比较传统的定义,其主要特征是用计算机替代手工操作,可以归结为工作流1.0时代的应用,实现了最基本的办公自动化,也称为“无纸化办公”。 在工作流1.0时代,OA办公系统中的各个流程都是孤立存在、独立运行的,每个流程,以及流程中的数据并不和其他流程进行交互和整合,更没有和第三方业务应用系统进行整合。 显然,工作流1.0只能实现简单的审批和协办过程,已经难以满足客户更高层次的办公需求,最主要的表现便是:工作流难以实现系统内部和外部的数据整合。但随着OA办公系统的应用在不断深化,“无纸化”到“智能化”和“整合化”的转变是一个必然的趋势。因此,作为OA办公系统应用的核心,工作流的技术和理念也同样发生了很大的转变。 PHPOA工作流2.0的提出,则顺应了这一发展趋势。PHPOA给工作流2.0的定义是:实现工作过程管理的自动化、智能化和整合化。工作流2.0最主要的特征就是可以灵便的实现数据整合和数据统计,消除信息孤岛,既能实现OA办公系统内部工作流之间的数据整合,如借款与报销、预算与决算等,又能实现OA办公系统工作流与其他业务系统之间的数据整合,如hr、erp、crm等。工作流2.0能彻底的弥补工作流1.0的不足,它不但实现OA办公系统内部的数据整合,也实现OA办公系统和第三方应用系统之间的数据整合。 如果给工作流1.0打上标签的话,那就是“无纸化、重复工作、流程孤岛、系统孤岛、数据孤岛”;工作流2.0对应的便是“智能化、效率质量提升、外部数据整合、消除信息孤岛、内部数据整合”。毫无疑问,工作流2.0更加智能,更加整合,能够实现数据的同步交换和共享的特征更受用户欢迎,能有效帮助企业简化多余流程,节省人力成本,大幅提升工作效率和质量,是未来工作流技术发展的方向,也是OA办公系统技术发展和应用的重点。 有人说,OA办公系统发展到现在,更像是一个大框,很多概念都可以往里装。这种发展模式显然是忽略了OA办公系统的本质。因为,推广和实施oa的根本目的不仅是帮助企业建立一套完整的信息化管理系统,更重要的是透过先进的管理思想和方法实现管理的提升、业务的改善,这就需要始终以工作流为核心,在技术和理念上不断改进,从而让OA办公系统更为实用、日趋完美。PHPOA对工作流2.0的首创,就树立了一个成功的榜样,也为国内OA办公系统今后发展指明了正确的发展方向。 PHPOA软件!专业oa办公软件开源服务提供商,采用php+mysql开源语言,一直致力于应用管理软件基层研发,现己推出企业、集团、saas等应用平台!而且,PHPOA企业运营管理平台还能通过增减功能模块,让购买系统的价格进行调整,来满足不同企业的办公需求。

July 3, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb咨询SAC无法访问SAC数据库管理页面

【问题描述】 数据库是搭建在阿里云服务器上的,但是通过阿里云的外网ip访问不了SAC的页面? 【解决办法】 可能是由于阿里云服务器的防火墙和SELinux没有关闭,导致本地的浏览器访问不了SAC端口阿里云默认只打开了22和80端口,需要用户在阿里云服务器的管理控制台打开SAC的8000端口才能访问

July 3, 2019 · 1 min · jiezi

DBA职业发展之路去IOE等挑战之下DBA将何去何从

开篇随着近些年来,开源、自动化、云化的兴起,DBA职业也正悄然发生一些变化。经常有朋友咨询我,职业发展规划;特别是近期Oracle的大幅裁员之后,针对DBA这一职业未来该如何发展?本文是个人对此问题的一些看法,仅供各位参考! 数据是核心 将DBA单词分解一下。其对应的 操作对象:数据操作介质:库操作角色:管理员这里的核心是数据,也是DBA这一角色最大的价值所在。他们最了解数据、最懂得数据的价值;因此DBA后续可发展的一些方向,也基本是与数据有关。 此外,对于数据要有更加宏观的认识,无论是企业的自有数据,还是外部获得;无论是关系数据,还是其他模式数据;无论是保存在数据库中,还是其他诸如日志等介质中,数据对企业都非常有价值,要将数据作为一种"资产"来管理。只有上升到这样的高度,数据相关岗位的价值也就凸显出来。 阶段不同,侧重不同 企业对数据应用水平不同,因而造成工作重心及岗位需求也有所不同。下面简单描述下各个层次: 层次一,是以数据库维护为主,常见表现是"救火队员"型。很多初创企业,都经历过这一过程。数据库维护基本靠人,随着运维体量的增加,需要线性增加人员。整体数据应用水平,基本处于简单、粗放型。层次二,仍是以数据库维护为主,但已形成较为完善的运维体系。除了基础运维之外,甚至可以考虑一些预防性的措施,提高整体的运维效益。这一阶段的体系化建设,往往是通过文档、运维平台等沉淀下来。数据库作为基础设施层,已可提供较好的数据存储、计算能力输出。但此阶段尚未从更高角度去考虑数据问题,仍仅限于运维层面。层次三,数据设计应用阶段,企业已不满足数据简单的"存取类"需求,而是从更高的应用角度,考虑如何提高整体数据应用水平。这个阶段会增加数据库架构、设计,加强业务端数据优化工作。表现为增加产品DBA的角色,加大数据库架构权重等。层次四,数据架构治理阶段,企业不单从某个应用、某条业务线去考虑数据问题,而是公司整体层面做数据的顶层设计。考虑建立专门的机构(如数据委员会)或岗位-首席数据官(CDO)。近些年来,颇为火热的"数据中台",正是为迎合这一需求而产生的。基础运维工作,繁琐枯燥 作为基础类的运维工作,数据库的要求是比较高的。上图简单罗列了部分工作,对DBA日常繁琐工作可见一斑。正是基于这点,平台化、自动化、云化的诉求,不断被提出。进而间接对DBA的能力提出了更高的要求。 DBA职能,向上进化 基于前面数据应用水平所谈到的,企业内部DBA也对应承担了几类职能。自下而上的是数据物理架构、逻辑架构和业务架构。公司内应用水平高低,也决定了DBA各类工作的比例侧重不同。随着公司数据应用水平的不断提高,DBA工作重心也应从下层逐步转向中上层。 数据物理架构,对应为"运维DBA",工作重心为基础架构的建设。数据逻辑架构,对应为"产品DBA",工作重心为数据库架构、架构设计及SQL质量问题。数据业务架构,对应为"数据架构师-DA",工作重心在于数据治理、管理类工作。DBA面临冲击不断 近些年来,DBA职位受到很大一些冲击,我摘其重要的几项说明下。 去IOE,阿里最早提出"去IOE"的叫法。它的提出,让人们第一次领悟到,企业的核心应用是可以不依赖于传统的国外大型商业数据库,进而提出了一种新的解决思路。开源与商业,企业发展阶段不同,对于开源还是商业软件的使用存在类似上图的收益/成本曲线。当发展到一定阶段时,是必须要考虑引入开源。企业要从技术战略角度出发,考虑这一问题。"四化",数据库基础运维工作,经历了从手工、脚本、工具、平台的发展阶段。其发展特点表现为"四化"(平台化、可视化、自动化、智能化)。这一发展方向也对DBA的技能要求产生了一些变化,特别是对研发的技能要求已成为必要条件。云,是未来的发展方向。从全球范围来看,云生态的数据库占比在8%,未来预计在3~5年内,会提升到20%~30%。这无疑是巨大的飞跃。对于DBA而言,云环境下的数据库工作有别于传统环境,需要从多方面去适应,工作重心也要有所调整。技术 OR 管理 DBA职业发展,向上面临的第一个选择就是发展方向,是走管理路线还是技术路线。上图给大家描述了两种不同方向的区别,个人可根据自己特质,对号入座。这里要避免一个误区,就是"以管理为上",这其实就是官本位思想的体现。不是每个人都适合管理路线,放在不恰当的位置上,对人的发展是一种摧残。 客观判断,承认上限 在明确了发展路线之后,就需要对自身的发展阶段有所判断。无论是技术还是管理,都存在这样一个进化理论,即越走向高级阶段,其淘汰率越高。要客观、理性地认识到自己所处的阶段。从上述比例也可以看出,能走到高阶职位的毕竟是少数。虽然可以通过一些方式(后面会谈到)做突破,但是仍然有较大概率无法取得既定目标。此时,要勇于承认这一点,调整自己的职业定位,谋求新的发展方向。 高度与广度 + 全局思维 取得职业发展突破,有两个小的建议。 高度与广度。在职业发展初期,需要有个快速成长的"原始积累期"。这里谈到的原始积累,不是财富,而是技术技能。要在某专一领域,尽量达到自己的技术高点。会存在某个点,你已经无法突破达到更高的高度时,要谨慎分析原因。如确实非主观原因,那么要坦然接受它。剩下来的技术发展,可考虑横向发展,即将自己打造成"T字型"人才。上面谈到的高点很重要,它会决定你的技术"视野"。全局思维。即不要仅仅从技术角度考虑问题,特别是达到一定高度之后,可更多地尝试从业务角度、人的角度考虑之前面临的问题,也许你就会有新的发现。全局思维,会有助于你发现原有发展阶段的瓶颈点,实现突破。DBA职业选择路线 前面讲了很多,那么DBA职业发展可考虑哪些方向呢?下面试图给出一些可能的选择。以下仅仅是本人根据自己所熟悉的领域给出的选择,不代表全部。 选择:数据库技术、数据库业务 -数据库技术。这是一个比较容易的选择,即在某数据库领域里不断精进自己,以达到一个更高的目标。职业定位是首席DBA、DBA专家等。如果考虑这个发展方向,建议考虑乙方或云厂商,因为他们对技术本身要求更高。甲方角色,受限于自身环境,一般很难有需要不断突破的技术氛围。 数据库业务。将数据库技术与公司业务相结合,突出在某业务领域的数据能力。这是需要在某行业打磨多年,充分了解其业务特点,不断抽象出其数据要求。这一方向可考虑行业的头部公司或者是专为某行业服务的ISV。选择:内核研发、数据库架构 -数据库内核研发,是相对"小众"的一类人才需求,一般只有大型企业/云厂商或数据库厂商会考虑设置。其专业性较强,人员素质要求也较高。建议选择高起点的一些企业,对个人长期职业发展有利。 数据库架构师,这是一个相对综合类的职位。"架构"的含义比较模糊,各企业对架构师角色的定位也各不相同。一般能考虑设置数据库架构师角色的企业,都是有一定规模,企业内数据应用比较复杂的情况。下面根据我所在公司的实际场景,尝试给出一个数据库架构师的技能图谱,供各位参考。一家之言:数据库架构师技能图谱 上图罗列对数据库架构师本身要求的十二项基本能力要求,各项能力的要求不同,我通过左侧的饼图比例大小予以说明。当然能符合全部要求的人,少之又少。公司可根据侧重,有所取舍。上述技能要求,可大致分为四类: -数据自身技能,如数据库、大数据、数据治理、数仓等 关联领域技能,如基础设施、云、容器等研发方向技能,如DevOps等综合技能类,如业务思维、软技能(如沟通技巧)选择:数据架构、数据产品 -数据架构,不同于"数据库架构"。数据架构,更强调于顶层设计,需要对数据有全局的思维,帮助企业做好整体数据规划设计工作。它不在拘泥于某种技术,而是着眼于数据整合、安全、共享、价值、资产等问题。 数据产品,也是一种综合类职位。需要对技术本身有一定深入的了解,但更强调其技术广度。此外需要有产品化思维,能将业务需求,转换为产品功能设计。选择:解决方案架构、数据库布道者 -解决方案架构,往往是从"售前架构"、"技术顾问"等角色体现出来。其核心要点是具备一定技术能力的同时,还要有甲方思维,能够了解用户痛点,能从技术角度帮助客户解决现有问题。这里不光是销售自己的产品,更重要的是给客户带来价值。 数据库布道者,少数的选择,只针对有一定技术影响力的人员才可以考虑。是一种偏向于自由职业者的选择。选择:数据治理、数据仓库 -数据治理,是一项比较"浩大"的工程。随着企业对数据的重视程度越来越高,这一岗位也愈发重要起来。其强调几个关键过程域的活动,提升企业整体数据应用水平。右图中给出的DAMA的过程域图例,供大家参考。 数据仓库,是一个处于转型中的职位,传统的数仓做法,目前已不适应现代企业要求。但其核心的数据建模理论,还是具有指导意义的。因此各大互联网公司,均有自己颇有特色的数仓实践。可以考虑大厂或行业头部客户作为选择。选择:大数据、运维开发 -大数据,作为大"DBA"的范畴,大数据领域某种意义上将也是一种数据库。当然它有其自身的特殊性,表现为技术分散、变化快、没有统一标准、对研发能力有一定要求等。 DevOps,运维开发。适合有一定研发基础的DBA选择。选择:项目管理、技术管理 -项目管理,DBA是一个比较综合类的职位,在沟通、协调、组织方面,与项目管理有相似在之处。因此,可以考虑转型做项目管理类职位。 技术管理,DBA职位的涉及的技术领域较广,如稍加留意是可以涉猎很多关联领域。这与技术管理类对技能诉求,有一定相似。再加上其对软技能的要求,是可以考虑将技术管理作为发展方向。在圈子中也发现不过高级管理人员,都是DBA出身,不无一定道理。写在最后 面对一个充满不确定性的未来,唯一能确定的就是变化。让我们拥抱变化,努力改变今天的自己! 内容来源:韩锋老师于ACMUG沙龙(北京站)的分享,首发公众号-韩锋频道,欢迎关注。宜信技术学院

July 3, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb咨询导入导出导入2300M的csv文件到数据库后用了4880M空间

【问题描述】 1、csv文件2300M导入数据库之后用了4880M空间,是什么原因导致的? 2、4880M的空间大概分为数据文件空间和索引文件空间各一半,为什么索引文件也会占用这么大的空间? 【解决办法】 1、由于Sequoiadb是以bson结构存储数据,与csv的结构比较多了key和数据类型的信息,因此以bson结构存储需要更大的存储空间。 2、当csv文件导入到Sequoiadb时,还会产生一个oid,这是一个默认的唯一索引,Sequoiadb是将数据文件和索引文件分开存储的,因此空间上会分为这两个部分,而索引文件的空间大小是与具体索引记录相关的。

July 3, 2019 · 1 min · jiezi

小程序公众号免费商城系统源码

源码地址 功能简介 1.商品: 能够对商品的状态分类管理 (出售中、待上架、库存中、已售馨、库存警戒、回收站)、添加产品、添加商品分类等功能 2.会员:站内会员的管理 (发放优惠劵、发通知、发图文消息、增加余额、会员行为详情)、站内通知 、微信端用户管理 (微信用 户的管理、分组、行为观察、添加标签) 等功能 3.营销:能够管理优惠的发放和制作、用户积分的统计使用情况、秒杀产品的管理等 4.财务:能够对用户的消费、充值、返佣的记录 5.订单:能够完成用户的订单管理(发货、订单详情、修改订单、订单备注、订单记录、订单退款) 、售后服务 (评论的回复与删除) 6.分销:后台有分销统计管理,分销可以设置人人分销和指定人分销,也可以自己稍微开发一下修改规则,例如下单后成为分销等 7.数据统计图表统计分析(财务统计、产品统计、会员统计、营销统计、分销统计、交易统计等) 8.设置:能够完成管理员对网站的商品资料(添加大类、添加小类、商品添加、属性快速生成、商品审查)、商品交易(外理订单、发 货查询)、会员管理(会员审查)、操作管理(管理员添加、管理员审查、管理员退出)、系统配置、后台通知等功能 9.内容:管理文章分类 (添加分类、删除分类、修改分类) 、 管理文章 10.维护:查看系统日志、文件变动效验、刷新网站缓存、在线更新系统、清除数据、文件管理等功能 11.强大的权限管理系统

July 3, 2019 · 1 min · jiezi

MySQL-索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。 普通索引创建索引这是最基本的索引,它没有任何限制。它有以下几种创建方式: CREATE INDEX indexName ON mytable(username(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。 修改表结构(添加索引) ALTER mytable ADD INDEX [indexName] ON (username(length))创建表的时候直接指定 CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)));删除索引的语法 DROP INDEX [indexName] ON mytable;唯一索引它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式: 创建索引 CREATE UNIQUE INDEX indexName ON mytable(username(length))修改表结构 ALTER table mytable ADD UNIQUE [indexName] (username(length))创建表的时候直接指定 CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)));使用ALTER 命令添加和删除索引有四种方式来添加数据表的索引:ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。 ...

July 2, 2019 · 1 min · jiezi

在线ER模型设计可视化MySQL数据库建表及操作

概述ER模型使用可视化了实体存储的信息,以及直观的呈现了实体与实体的关系,在我们实际的应用系统开发过程中新建ER模型可以更好的理解业务模型,为以后的开发维护工作起到归纳总结的作用。 [Freedgo Desgin]()是一款轻松、快速、协作地创建各种专业图表工具。让您在线创建流程图、系统部署图、软件架构图、UML、BPMN、ER模型,DFD,组织图,软件流程图,图表。免费试用。使用Freedgo Design创建数据库ER模型目前支持MySQL及基本的SQL语句建表。后期会进行功能拓展以支持SQL Server,Oracle,PostgreSQL,等等数据库模型建模,支持SQL导入生成ER模型,通过DDL语句生成ER模型,ER模型SQL导出,根据ER模型生成SQL。 如果你使用ERwin 或者PowerDesign等等传统的客户端工具设计表结构,不妨体验一下在线ER模型带来的轻量级,云端存储,随时使用的好处。 提供如下功能:支持表、视图、存储过程、函数在线绘制,支持多种样式可供选择使用MySQL DDL 语言实现在线导入生成ER模型针对ER模型中表实体实现生成建表SQL语句,支持多表生成针对ER模型中选择表的字段生成字段新增或修改SQL语句在线导出ER模型对应的SQL脚本快速上手基本使用:如果要使用MySQL表建立ER模型,请选择实体类型为实体关系/MySQL,选择对应的表、视图、存储过程、触发器、函数等组件后拖动到编辑区域。 1、如何导入SQL?已经建立好的数据库如何生成ER模型有一种比较简单的方式就是导出数据库的建表脚本后再导入,具体操作如下: 首先访问 https://www.freedgo.com/draw_... ,点击菜单 数据库 -> MySQL -> 导入DDL 复制SQL语言到对应的框中,或者拖动MySQL DDL文件到对应的输入框、点击insert MySQL 或拖动SQL文件到对应的输入框 最后生成对应的模型图 2、在线ER模型表操作新增修改表结构在线对表字段进行新增,可以在需要添加字段的位置点击箭头进行添加, 添加字段后点击右键->修改列 可以修改字段的属性值,支持字段名、类型、长度、是否主键、是否外键、备注 、是否为空等等 3、在线视图操作新增或修改视图:通过拖动MySQL视图模型到编辑区,对视图的编辑通过点击右键->视图SQL,在弹出框中进行视图的SQL修改。 4、在线触发器操作操作同视图操作 5、在线存储过程或者函数操作操作同视图操作 6、导出SQL查询整个ER模型的SQL:点击数据库 -> MySQL -> 导出SQL 查询多表或单表SQl:如下图:选择3个表右键: 查询列的修改SQL或新增SQL

July 2, 2019 · 1 min · jiezi

freebsd下实现mysql的自动备份

沟通很重要,沟通的渠道很重要。当团队需要配合的时候,要想办法将自己当下做的事情,以最有效的方式通知给团队其它成员,以避免不必要的伤害。 比如,刚刚发生了如下事情:有一测试系统,历史的任务是完成上线前的最后一次测试,然后:A 为了客户演示系统的使用,在此系统上添加了大量的供演示用的支撑数据。B 为了删除生产环境下冗余数据,用生产环境下的数据覆盖了测试的数据。 导致:A很无奈:覆盖数据前竟然不和我打招呼!B很无辜:测试系统不就是用来测试而可以随时覆盖的吗? 以上是闲谈,如果我们每日都对数据进行备份呢?是不是就可以解决A、B两个人的问题? 脚本#!/bin/bash# # Set these variablesMyUSER="" # DB_USERNAMEMyPASS="" # DB_PASSWORDMyHOST="" # DB_HOSTNAME# Backup Dest directoryDEST="" # /home/username/backups/DB# Email for notificationsEMAIL=""# How many days old files must be to be removedDAYS=3# Linux bin pathsMYSQL="$(which mysql)"MYSQLDUMP="$(which mysqldump)"GZIP="$(which gzip)"# Get date in dd-mm-yyyy formatNOW="$(date +"%d-%m-%Y_%s")"# Create Backup sub-directoriesMBD="$DEST/$NOW/mysql"install -d $MBD# DB skip listSKIP="information_schemaanother_one_db"# Get all databasesDBS="$($MYSQL -h $MyHOST -u $MyUSER -p$MyPASS -Bse 'show databases')"# Archive database dumpsfor db in $DBSdo skipdb=-1 if [ "$SKIP" != "" ]; then for i in $SKIP do [ "$db" == "$i" ] && skipdb=1 || : done fi if [ "$skipdb" == "-1" ] ; then FILE="$MBD/$db.sql" $MYSQLDUMP -h $MyHOST -u $MyUSER -p$MyPASS $db > $FILE fidone# Archive the directory, send mail and cleanupcd $DESTtar -cf $NOW.tar $NOW$GZIP -9 $NOW.tarecho "MySQL backup is completed! Backup name is $NOW.tar.gz" | mail -s "MySQL backup" $EMAILrm -rf $NOW# Remove old filesfind $DEST -mtime +$DAYS -exec rm -f {} \;

July 2, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb咨询SequoiaFS如何挂载目录并指定手工创建的元数据集合且集合为分区集合

【问题详细描述】 如何挂载目录并指定手工创建的元数据集合,且集合为分区集合?【解决方法】 1.在手工创建了目录和文件的元数据的分区集合后(假设目录元数据集合为:"sequoiafs.metadir_cl",文件元数据集合为:"sequoiafs.metafile_cl",分区键为"_id"),需要创建如下三个索引: 1)在目录元数据表中创建复合索引 "NameIndex": db.sequoiafs.metadir_cl.createIndex( "NameIndex", { Name:1, Pid:1, _id:1 },{ Unique: true, Enforced :true } ); 2)在文件元数据表中创建复合索引"NameIndex"和"LobOidIndex": db.sequoiafs.metafile_cl.createIndex( "NameIndex", { Name:1, Pid:1, _id:1 },{ Unique: true, Enforced :true } ); db.sequoiafs.metafile_cl.createIndex( "LobOidIndex", { LobOid:1, _id:1 },{ Unique: true, Enforced :true } ); 2.在挂载目录时使用 -d 和 -f 指定自己手工创建的元数据集合,不要指定 --autocreate默认生成元数据集合即可。 $sequoiafs /opt/sequoiadb/mountpoint -i localhost:11810 -l foo.bar -c /opt/sequoiafs/conf/foo_bar/001/ --diagpath /opt/sequoiafs/log/foo_bar/001/ -o big_writes -o auto_unmount -o max_write=131072 -o max_read=131072 -d sequoiafs.metadir_cl -f sequoiafs.metafile_cl ...

July 2, 2019 · 1 min · jiezi

巨杉数据库Sequoiadb咨询其他jdbc-连接-sdb-做-update-操作报10

【问题详细描述】 jdbc连接sdb做update操作,协调节点报-10,不能创建edu。这个edu是什么?-10是什么原因导致的? 【日志】 Function:StartEDU File:SequoiaDB/engine/pmd/pmdEDUMgr.cpp Line:1283 Message: Create edu[Type:23] failed, rc: -10 详细报错信息见附件:1.png 环境ulimit配置见附件:2.png 【解决办法】 看报错信息应该是分配线程失败,猜测应该是OS内核参数限制问题,建议: 调整内核参数,如当前问题机器 open files 为 65535,将 open files 调大为 131070: 1.临时生效:ulimit -n 131070; 2.永久生效:参考 http://www.bubuko.com/infodet... (跟客户确认将 open files 调大后问题解决。)

July 2, 2019 · 1 min · jiezi

php-实现mysql存储支持emoji表情

最近一直在做微信公众号相关的需求,突然发现如果用户的昵称是emoji标签的话,这时候用户的昵称无法正常的存储到数据库中 一:原因: 这是由于Mysql的utf8编码最多3个字节,然而emoji标签的是4个字节,所以无法存储emoji标签信息,所以需要将数据的编码改成utf8mb4 二:解决: 1:设置连接编码 SET NAMES utf8mb4上面的命令相当于: SET character_set_client='utf8mb4';SET character_set_connection='utf8mb4';SET character_set_results='utf8mb4';2:设置数据库编码 ALTER DATABASE database_name(数据库名) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;3:设置表编码 ALTER TABLE table_name(表名) CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;设置如上编码之后在php连接数据时设置: 'charset' => 'utf8mb4',进行如上配置之后,这时候存储emoji标签时存储成功!!!

July 1, 2019 · 1 min · jiezi

MysqlCenterOs7-安装-Mysql

第一次安装mysql服务端。记录一下 查看当前Linux 版本,确认版本后,方便选择对应的mysql服务 cat /etc/redhat-release下载MySQL官方的 Yum Repositoryhttps://dev.mysql.com/downloa...上传到linux上后 安装Repository安装 Repository yum -y install mysql80-community-release-el7-3.noarch.rpm 成功后,安装 mysql server yum -y install mysql-community-server 启动 mysql 服务 更改mysql 用户密码 登录mysql mysql -uroot -p修改密码 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;修改用户运行远程登录 mysql> use mysql;mysql> update user set host = '%' where user = 'root';mysql> select host, user from user;修改navicat链接mysql 的密码 mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';刷新 ...

July 1, 2019 · 1 min · jiezi