在MySQL中,TO_BASE64()函数将字符串转换为以base-64编码的字符串并返回结果。(相关推荐:《MySQL教程》) 语法 TO_BASE64(str) 其中str是需要编码的字符串。 例1 -基本用法 下面是一个例子来演示基本用法: SELECT TO_BASE64('Dog'); 结果: +------------------+ | TO_BASE64('Dog') | +------------------+ | RG9n | +------------------+ 在这个例子中,参数是Dog,一旦转换为base-64,它就变成了RG9n。 我们可以使用FROM_BASE64()函数来解码base-64字符串: SELECT FROM_BASE64('RG9n'); 结果: +---------------------+ | FROM_BASE64('RG9n') | +---------------------+ | Dog | +---------------------+ 例2 -一个较长的字符串 下面是一个使用更长的字符串的例子: SELECT TO_BASE64('My cat chases dogs!'); 结果: +----------------------------------+ | TO_BASE64('My cat chases dogs!') | +----------------------------------+ | TXkgY2F0IGNoYXNlcyBkb2dzIQ== | +----------------------------------+ 例3 -非字符串参数 如果参数不是字符串,它将首先转换为字符串: SELECT TO_BASE64(123); 结果: +----------------+ | TO_BASE64(123) | +----------------+ | MTIz | +----------------+ 例4 -NULL参数 如果你输入NULL,你会得到NULL: SELECT TO_BASE64(NULL); 结果: +-----------------+ | TO_BASE64(NULL) | +-----------------+ | NULL | +-----------------+ 例5 -缺少参数 如果你不传递一个参数,你会得到一个错误: SELECT TO_BASE64(); 结果: ERROR 1582 (42000): Incorrect parameter count in the call to native function 'TO_BASE64' 例6 -参数太多 如果你传入太多的参数,你也会得到一个错误: SELECT TO_BASE64('Cat', 'Dog'); 结果: ERROR 1582 (42000): Incorrect parameter count in the call to...
数据库的四个级别分为:读取未提交内容,读取提交内容,可重读以及可串行化。但隔离级别也会造成脏读,不可重复读以及幻读等问题 【推荐课程:MySQL教程】 数据库隔离的四个级别分别为: Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。 Serializable(可串行化) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。 隔离级别所产生的问题 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如: 脏读(Drity Read): 某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。 不可重复读(Non-repeatable read): 在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。 幻读(Phantom Read): 在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。 在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示: 隔离级别 脏读 不可重复读 幻读 读未提交 √ √ √ 读已提交 X √ √ 可重复读 X X √ 可串行化 X X X 总结:以上就是本篇文章的全部内容了,希望对大家有所帮助 以上就是数据隔离四个级别分别是哪些的详细内容,更多请关注php中文网其它相关文章!
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价,云服务器3年机/5年机限时抢购,低至 2.5折
mysql中索引类型有:最基本的没有限制的普通索引,索引列的值必须唯一的唯一索引,主键索引,多个字段上创建的组合索引以及用来查找文本中的关键字的全文索引 【推荐课程:MySQL教程】 MySQL中的索引类型有以下几种 普通索引 唯一索引 主键索引 组合索引 全文索引 1、普通索引 是最基本的索引,它没有任何限制。它有以下几种创建方式: 直接创建索引 CREATE INDEX index_name ON table(column(length)) 修改表结构的方式添加索引 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) 创建表的时候同时创建索引 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length)) ) 删除索引 DROP INDEX index_name ON table 2、唯一索引与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式: 创建唯一索引 CREATE UNIQUE INDEX indexName ON table(column(length)) 修改表结构 ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)) 创建表的时候直接指定 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , UNIQUE indexName (title(length)) ); 3、主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引: CREATE TABLE `table` (...
本篇文章给大家带来的内容是关于mongodb查询表字段、进行字符串截取以及更新的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 update() 方法用于更新已存在的文档。语法格式如下: db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 参数说明: query : update的查询条件,类似sql update查询内where后面的。update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选,抛出异常的级别。 例:图片替换地址,先模糊查询,再替换 db.pfs_merchants.find({'logo_url': /10.2.121.170/}).forEach(function(user) { user.logo_url = user.logo_url.replace("10.2.121.170","10.128.3.80"); print(user.logo_url); db.pfs_merchants.update({"_id":user._id},{$set:{"logo_url":user.logo_url}}); }) 本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的mongodb视频教程栏目! 以上就是mongodb查询表字段、进行字符串截取以及更新的方法的详细内容,更多请关注php中文网其它相关文章!
本篇文章给大家带来的内容是关于MySQL和Redis事务的比较(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 简言:一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 从标题来看,既然都是事务,那之间有什么区别?来一一解开,先从两个数据库说去。 MySQL 属于 关系型数据库 , Redis 属于 非关系型数据库,两者对事务有着不同的解释。 (相关推荐:MySQL教程,Redis教程) Redis [1] Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。 一个事务从开始到执行会经历以下三个阶段: 开始事务。 命令入队。 执行事务。 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。 操作错误 看着有点儿绕口,那就实际执行一下 看一下结果。 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tr_1 233 QUEUED 127.0.0.1:6379> lpush tr_1 666 QUEUED 127.0.0.1:6379> set tr_2 888 QUEUED 127.0.0.1:6379> exec 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) OK 在上面的事务中,设置了一个 key 为 tr_1 的字符串数据,然后又通过 lpush 来添加元素,这很明显是错误的操作方式,当我们提交事务候出现了一个操作错误,这时候我们来看看 tr_1 的值是什么。 127.0.0.1:6379> get tr_1 "233" 通过 get 命令来的tr_1 内容还是 233 ,并没有变,那再看一下其他的。 127.0.0.1:6379> keys * 1) "tr_2" 2) "tr_1" 127.0.0.1:6379> get tr_2 "888" 127.0.0.1:6379> 这里可以看到 tr_2 存在,并打印了值,这时候我们发现,即使出现了操作错误 ,但是错误并没有致使执行停止,错误之后的语句也执行了并成功执行,似乎符合上面提到的 中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。 语法错误 NO~,这时候还有另外一种情况 语法错误 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tr_1...
你可以使用MySQL Workbench运行一个查询,然后将该查询的结果导出到一个文件中。(相关推荐:《MySQL教程》) 步骤: 1、运行查询 2、单击“Results Grid”菜单栏上的“Export” 如下截图: 注意:MySQL Workbench默认将结果集限制为1000行。如果不希望你的结果集被限制在这个数量(或者已经指定的其他数量),请确保删除这个限制。 你可以通过单击“Limit to 1000 rows”下拉菜单并选择“Don't Limit”来更改该设置。 文件格式 你可以选择保存文件的文件格式。以下是撰写本文时支持的格式: 1、CSV 2、CSV (; separated) 3、HTML 4、JSON 5、SQL INSERT statements 6、Excel Spreadsheet 7、XML 8、XML (MySQL format) 9、Tab separated 查询菜单 你还可以通过MySQL Workbench Query 查询菜单启动导出: 查询菜单还提供了一个“Export Results…”(导出结果)选项。 你还可以使用SELECT ... INTO OUTFILE将查询结果从查询中导出。这将在查询运行时立即导出文件。 本篇文章就是关于MySQL Workbench导出查询结果的介绍,希望对需要的朋友有所帮助! 以上就是MySQL Workbench如何导出查询结果?(图文)的详细内容,更多请关注php中文网其它相关文章!
MySQL包含了很多函数和运算符,可以帮助我们处理数据。下面我们就给大家整理出MySQL中可用的数学函数,希望对需要的朋友有所帮助! ABS()返回给定值的绝对值。 ACOS()返回数字的反余弦值。 ASIN()返回数字的反正弦值。 ATAN()返回一个或多个值的反正切值。 ATAN2()返回两个参数的反正切。 CEIL()同义词是CEILING()。 CEILING()将一个数字四舍五入到最近的整数(返回不小于其参数的最小整数)。 CONV()转换不同数字基数之间的数字。 COS()返回数字的余弦值。 COT()返回数字的余切。 CRC32()计算循环冗余校验值。 DEGREES()从弧度转换为度数。 EXP()返回e到x的幂。 FLOOR()将数字向下舍入到最接近的整数(返回不大于参数的最大整数值)。 LN()返回数字的自然对数。 LOG()返回数字的自然对数。还允许您指定基数。 LOG10()返回参数的以10为底的对数。 LOG2()返回参数的以2为底的对数。 MOD()执行模运算。返回N除以M的余数。 PI()返回π(pi)的值。 POW()将引发的参数返回到指定的幂。 POWER()同义词POW()。 RADIANS()将值从度转换为弧度,并返回结果。 RAND()返回随机浮点值。 ROUND()将数字向上或向下舍入到给定的小数位数。 SIGN()返回参数的符号(这样您就可以知道数字是正数还是负数)。 SIN()返回参数的正弦值。 SQRT()返回参数的平方根。 TAN()返回参数的正切值。 TRUNCATE()将值截断为指定的小数位数。 相关推荐:《mysql教程》 以上就是MySQL数学函数的简单总结的详细内容,更多请关注php中文网其它相关文章!
MySQL更新语句也就是MySQL中的update语句,当我们需要更新或者修改表中的数据时,就会使用这个update语句,下面我们就来看一下mysql更新语句的具体写法。 MySQL中update语句用于更新表中的现有数据。亦可用UPDATE语句来更改表中单个行,一组行或所有行的列值。 MySQL中UPDATE语句的语法: 单表 UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET assignment_list [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] value: {expr | DEFAULT}assignment:col_name = value assignment_list:assignment [, assignment] ... 多表 UPDATE [LOW_PRIORITY] [IGNORE] table_references SET assignment_list [WHERE where_condition] UPDATE语句更新表时需要注意的是: UPDATE关键字后面指定要更新数据的表名。 SET子句指定要修改的列和新值。要更新多个列,请使用以逗号分隔的列表。 使用WHERE语句中的条件指定要更新的行。WHERE子句是可选的。 如果省略WHERE子句,则UPDATE语句将更新表中的所有行。 如果指定了ORDER BY子句,则按照被指定的顺序对行进行更新。 LIMIT子句用于给定一个限值,限制可以被更新的行的数目。 多表更新时ORDER BY和LIMIT不能被使用。 使用update语句修改表时: 单表修改是指修改指定单个表中的已经存在数据的一个或多个列的数值;set短语后面跟要修改的列和值; where子句表示限定要修改表中的哪些数据,如果没有where子句则表示所有行都要修改; order by子句表示update数据按照指定的顺序进行; limit子句表示限定修改数据的行数; 多表修改是指修改table_references指定的多个表中满足条件的行数据,多表修改不允许使用order by和limit子句。 本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的MySQL视频教程栏目! 以上就是mysql更新语句怎么写?的详细内容,更多请关注php中文网其它相关文章!
本篇文章给大家带来的内容是关于MySQL执行过程以及查询缓存的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 MySQL执行一个查询过程:当我们向MySQL发送一个请求的时候,MySQL到底做了什么: 1.客户端发送一条查询给服务器2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。3.服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。4.MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询5.将结果返回给客户端。 mysql 主要是由 server 层和存储层两部分构成的。server 层主要包括连接器、查询缓存,分析器、优化器、执行器。存储层主要是用来存储和查询数据的,常用的存储引擎有 InnoDB、MyISAM, (1) MySQL客户端/服务器通信协议 MySQL客户端和服务器之的通信协议是“半双工”的,这就意味着,在任何一个时刻,要么是由服务器向客户端发送数据,要么是由客户端向服务器发送数据,这两个动作不能同时发生。所以我们无法也无须将一个消息切成小块独立来发送。 优缺点:这种协议让MySQL通信简单快速,但是也从很多地方限制了 MySQL。一个明显的限制是,这意味着没法进行流量控制。一旦一端开始发送消息,另一端要接收完整个消息才能响应它。这就像采回抛球的游戏:在任何时刻,只有一个人能控制球,而且只有控制球的人才能将球抛回去(发送消息)。 (2).连接器 MySQL客户端和服务端建立连接,获取当前连接用户的权限 (3)查询缓存在解析一个查询语句之前,如果查询缓存是打开的,MySQL会检查这个缓存,是否命中查询缓存中的数据。这个检查是通过一个大小写敏感的哈希查找实现的。查询和缓存中的查询即使只有一个字节不同,那也不会匹配缓存结果,这种情况下查询就会进入下一阶段的处理。 如果当前的查询恰好命中了查询缓存,那么在返回查询结果之前 MySQL会检查一次用户权限。这仍然是无须解析查询SQL语句的,因为在查询缓存中已经存放了当前查询需要访问的表信息。如果权限没有问题, MySQL会跳过所有其他阶段,直接从缓存中拿到结果并返回给客户端。这种情况下,查询不会被解析,不用生成执行计划,不会被执行. ps:注意在 mysql8 后已经没有查询缓存这个功能了,因为这个缓存非常容易被清空掉,命中率比较低。 (3).分析器 既然没有查到缓存,就需要开始执行 sql 语句了,在执行之前肯定需要先对 sql 语句进行解析。分析器主要对 sql 语句进行语法和语义分析,检查单词是否拼写错误,还有检查要查询的表或字段是否存在 (4)查询优化 查询的生命周期的下一步是将一个SQL转换成一个执行计划, MySQL再依照这个执行计划和存储引擎进行交互。这包括多个子阶段:解析SQL、预处理、优化SQ执行计划。这个过程中任何错误(例如语法错误)都可能终止查询。 2.关于查询缓存 (1)MySQL 判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用。MySOL查询缓存保存查询返回的完整结果。当查询命中该缓存, MySQL会立刻返回结果跳过了 解析,优化和执行阶段 查询缓存系统会跟踪查迫中涉及的每个表,如果这些表发生变化,那么和这个表相关的的存数据都将失效。 这种机制效率看起来比较低,因为数据表变化时很有可能对查询结果并没有变更,但是这种简单实现代价很小,而这点对于一个非常繁忙的系统来说非常重要。 查询缓存系统对应用程序是完全透明的。应用程序无须关心 MySQL是通过查询缓存返回的结果还是实际执行返回的结果。事实上,这两种方式执行的结果是完全相同的。换句话说,查询缓存无须使用任何语法。无论是 MYSQL开启成关闭查询缓在,对应用程序都是透明的。 (2)判断缓存命中 当判断缓存是否命中时, MySQL不会解析、“正规化”或者参数化查询语句,而是直接使用SQL语句和客户端发送过来的其他原始信息,在字符上不同,例如空格、注释,在何的不同,都会导致缓存的不中。 当查询语句中有一些不确定的数据时,则不会被缓存,例如包含函数NOW()或者 CURRENT_DATE()的查询不会被缓存. 误区:我们常听到:“如果查询中包含一个不确定的函数, MySQL则不会检查查询缓存”。这个说法是不正确的。 因为在检查查询缓存的时候,还没有解析SQL语句,所以MySQL并不知道查询语句中是否包含这类函数。 在检查查询缓存之前, MySQL只做一件事情,就是通过一个大小写不敏感的检查看看SQL语句是不是以5EL开头。 准确的说法应该是:“如果查询语句中包含任何的不确定函数,那么在查询缓存中是不可能找到缓存结果的”。 注意点:MySQL的查询缓存在很多时候可以提升查询性能,在使用的时候,有一些问题需要特别注意。首先,打开查询缓存对读和写操作都会带来额外的消耗: 1.读查询在开始之前必须先检查是否命中缓存2.如果这个读查询可以被缓存,那么当完成执行后, MySQL若发现查询缓存中没有这个查询,会将其结果存入查询缓存,这会带来额外的系统消耗。3.这对写操作也会有影响,因为当向某个表写入数据的时候, MySQL必须将对应表的所有缓存都设置失效。如果查询缓存非常大或者碎片很多,这个操作就可能会带来大系统消耗(设置了很多的内存给查询缓存用的时候) 如果查询缓存使用了很大量的内存,缓存失效操作就可能成为一个非常严重的问题瓶颈如果缓存中存放了大量的查询结果,那么缓存失效操作时整个系统都可能会僵死一会 因为这个操作是靠一个全局锁操作保护的,所有需要做该操作的查询都要等待这个锁,而且无论是检测是否命中缓存、还是缓存失效检测都需要等待这个全局锁。 (3)什么情况下查询缓存能发挥作用理论上,可以通过观察打开或者关闭查询缓存时候的系统效率来决定是否需要开启查询。 对手那些需要消耗大量资源的查询通常都是非常适合缓存的。例如一些汇总计算查询具体的如 COUNT()等。总地来说,对于复杂的 SELECT语句都可以使用查询缓存,例如多表JOIN后还需要做排序和分页,这类查询每次执行消耗都很大,但是返回的结果集却很小,非常适合查询缓存。 不过需要注意的是,涉及的表上 UPDATE、 DELETE和 INSERT操作相比 SELECT来说要非常少才行。 判断查询缓存是否有效的直接数据是命中率。就是使用查询缓存返回结果占总查询的比率 不过缓存中率是一个很难判断的数值。命中率多大才是好的命中率。具体情况,具体分析。 只要查询缓存带来的效率提升大于查询缓存带来的额外消耗,即使30%命中率对系统性能提升也有很大好处。另外,缓存了哪些查询也很重要,例如,被缓存的查询本身消耗非常巨大,那么即使缓存命中率非常低,也仍然会对系统性能提升有好处 缓存未命中可能有如下几种原因: 1.查询语句无法被缓存,可能是因为查询中包含一个不确定的函数(如 CURREN_DATE)或者查询结果太大而无法缓存。这都会导致状态值 Cache not cached增加。2.MySQL从未处理这个查询,所以结果也从不曾被缓存过。 3.还有一种情况是虽然之前缓存了查询结果,但是由于查询缓存的内存用完了,MySQL需要将某些缓存“逐出”,或者由于数据表被修改导致缓存失效。 如果你的服务器上有大量缓存未命中,但是实际上绝大数查询都被缓存了,那么一定是有如下情况发生: 1.查询缓存还没有完成预热。也就是说, MySQL还没有机会将查询结果都缓存起来。2.查询语句之前从未执行过。如果你的应用程序不会重复执行一条查询语句,那么即使完成预热仍然会有很多缓存未命中3.缓存失效操作太多了。 (4)如何配置 和维护查询缓存 query_cache_type 是否打开查询缓存。可以设置成0FN或 DEMAND。 DEMAND表示只有在查询语句中明确写明SQL_ CACHE的语句才放入查询缓存。这个变量可以是会话级别的也可以是全局级别的 query_cache_size 查询缓存使用的总内存空间,单位是字节。这个值必须是1024的整数倍,否则 MySQL实际分配的数据会和你指定的略有不同。 query_cahce_min_res_unit 在查询缓存中分配内存块时的最小单位。 query_chache_limit MySQL能够缓存的最大査询结果。如果查询结果大于这个值,则不会被缓存。因为査询缓存在数据生成的时候就开始尝试缓存数据,所以只有当结果全部返回后,才知道查询结果是否超出限制 如果超出, MySQL则增加状态值 Cache_not_cached,并将结果从查询缓存中删除如果你事先知道有很多这样的情况发生,那么建议在查询语句中加入 (5)替代方案 MySQL查询缓存工作的原则是:执行查询最快的方式就是不去执行,但是查询仍然需要发送到服务器端,服务器也还需要做一点点工作。如果对于某些查询完全不需要与服务器通信效果会如何呢?这时客户端的缓存可以很大程度上帮你分担 MySQL服务器的压力 总结: 完全相同的查询在重复执行的时候,查询缓存可以立即返回结果,而无须在数据库中重新执行一次。根据我们的经验,在高并发压力环境中在询缓存会导致系统性能的下降,甚至僵死。 如果一定要使用查询缓存,那么不要设置太大内存,而且只有在确收益的时候才使用。 那该如何判断是否应该使用查询缓存呢?建议使Percona server.,观察更细致的日志,并做一些简单的计算。还可以查看缓存命中率(并不总是有用)、“ NSERTS和 SELECT比率”(这个参数也并不直观)、或者“命中和写入比率”(这个参考意义较大)。 查询缓存是一个非常方便的缓存,对应用程序完全透明,无须任何额外的编码,但是、如果希望有更高的缓存效率,我们建议使cache 或者其他类似的解决方案。 【相关推荐:MySQL视频教程】 以上就是MySQL执行过程以及查询缓存的详细介绍的详细内容,更多请关注php中文网其它相关文章!
MySQL中的存储过程指的是存储在数据库中的SQL语句集合,当创建好存储过程后在运行时提供所需参数,存储过程就可以以代码指定的方式使用参数执行并返回值 在MySQL中提供了创建存储过程的能力。存储过程是MySQL以及其他数据库管理系统中的强大功能。接下来在文章中将为大家具体介绍MySQL中的存储过程,具有一定的参考作用,希望对大家有所帮助。 【推荐课程:MySQL教程】 存储过程: 存储过程指的是存储在数据库中的SQL语句的集合。存储过程它可以包含业务逻辑,这是区分存储过程和视图的关键之一。另外存储过程还可以接受参数,我们可以在存储过程中设置变量,写入语句等。 存储过程如何工作 首先要先创建一个存储过程然后再运行。在运行的过程中需要提供它所需要的参数,然后存储过程将以代码指定的任何方式使用参数执行。例如,编写一个接受FruitId参数的存储过程。然后在存储过程可以获取该参数并使用它来检查该特定水果的库存。因此我们可以调用存储过程,即每次使用不同的水果ID它都将返回一个值,并显示该库存中有多少水果。 创建存储过程 我们可以通过CREATE PROCEDURE语句创建存储过程 CREATE PROCEDURE demo_name(p_1 INT) BEGIN ...code goes here... END; demo_name指的是存储过程的名称,括号是必须的,如果里面不包含任何参数则括号可以为空 存储过程的主体是介于BEGIN和END关键字之间。这些关键字用于编写复合语句。复合语句可以包含多个语句,如果需要,可以嵌套这些语句。 例:创建一个存储过程名为FruitStock: DELIMITER // CREATE PROCEDURE FruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ; 创建好了一个存储过程,接下来将调用这个存储过程 调用一个参数为1的ID CALL FruitStock(1); 删除存储过程 可以使用DROP PROCEDURE语句删除存储过程。 DROP PROCEDURE FruitStock; 改变存储过程 在存储过程中可通过下列语句更改存储过程ALTER PROCEDURE。 需要注意要更改存储过程的主体或其任何参数时,需要删除该过程然后再次创建 例:添加Fruit.FruitId所要返回的列表 DROP PROCEDURE IF EXISTS FruitStock; DELIMITER // CREATE PROCEDURE FruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ; 总结:以上就是本篇文章的全部内容了,希望对大家有所帮助。 以上就是MySQL存储过程的理解的详细内容,更多请关注php中文网其它相关文章!
本篇文章主要给大家介绍mysql索引原理,希望对需要的朋友有所帮助!(相关推荐:《mysql教程》) 索引的目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者ze开头的单词呢?是不是觉得如果没有索引,这个事情根本无法完成? mysql索引原理 除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。 数据库也是一样,但显然要复杂许多,因为不仅面临着等值查询,还有范围查询(>、<、between、in)、模糊查询(like)、并集查询(or)等等。数据库应该选择怎么样的方式来应对所有的问题呢? 我们回想字典的例子,能不能把数据分成段,然后分段查询呢?最简单的如果1000条数据,1到100分成第一段,101到200分成第二段,201到300分成第三段……这样查第250条数据,只要找第三段就可以了,一下子去除了90%的无效数据。 但如果是1千万的记录呢,分成几段比较好?稍有算法基础的同学会想到搜索树,其平均复杂度是lgN,具有不错的查询性能。但这里我们忽略了一个关键的问题,复杂度模型是基于每次相同的操作成本来考虑的,数据库实现比较复杂,数据保存在磁盘上,而为了提高性能,每次又可以把部分数据读入内存来计算,因为我们知道访问磁盘的成本大概是访问内存的十万倍左右,所以简单的搜索树难以满足复杂的应用场景。 以上就是mysql索引原理是什么?的详细内容,更多请关注php中文网其它相关文章!
本篇文章给大家带来的内容是关于MySQL中EXPLAIN解释命令的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1 EXPLAIN概念 EXPLAIN会向我们提供一些MySQL是执行sql的信息: EXPLAIN可以解释说明 SELECT, DELETE, INSERT, REPLACE, and UPDATE 等语句. 当EXPLAIN与可解释的语句一起使用时,mysql会显示一些来自于优化器的关于sql执行计划的信息。即mysql解释它是如何处理这些语句的,和表之间是如何连接的。想获取更多关于EXPLAIN如何获取执行计划信息的。 当EXPLAIN后面是一个会话的connection_id 而不是一个可执行的语句时,它会展示会话的信息。 对于SELECT语句,EXPLAIN会产生额外的执行计划信息,这些信息可以用SHOW WARNINGS显示出来。 EXPLAIN对于检查设计分区表的查询时非常有用。 FORMAT选项可以用于选择输出格式,如果没有配置FORMAT选项,默认已表格形式输出。JSON 选项让信息已json格式展示。 2 EXPLAIN 输出列信息 EXPLAIN输出的字段信息第一列:列名, 第二列:FORMAT = JSON时输出中显示的等效属性名称 ,第三列:字段含义 Column JSON Name Meaning id select_id select标识号 select_type None select类型 table table_name 这一行数据是关于哪张表的 partitions partitions 匹配的分区,对于未分区表,该值为空 type access_type 使用的连接类别,有无使用索引 possible_keys possible_keys MySQL能使用哪个索引在该表中找到行 key key MySQL实际决定使用的键(索引) key_len key_length MySQL决定使用的键长度。如果键是NULL,长度为NULL ref ref 与索引关联的列 rows rows mysql认为执行sql时必须被校验的行数 filtered filtered 表示此查询条件所过滤的数据的百分比 Extra None 附加信息 2.1 id SELECT标识符。SELECT在查询中的序列号,可以为空。 2.2 select_type SELECT类型,所有类型在下表中展示,JSON格式的EXPLAIN将SELECT类型公开为query_block的属性,除非它是SIMPLE或PRIMARY。 JSON名称(不适用为None)也显示在表中。 select_type Value JSON Name Meaning SIMPLE None 简单SELECT(不使用UNION或子查询等) PRIMARY None 嵌套查询时最外层的查询 UNION None UNION中的第二个或后面的SELECT语句 DEPENDENT UNION dependent (true) UNION中的第二个或以后的SELECT语句,取决于外部查询 UNION RESULT union_result UNION的结果 SUBQUERY None 子查询中的第一个选择 DEPENDENT SUBQUERY dependent (true) 子查询中的第一个选择,取决于外部查询 DERIVED None 派生表(子查询中产生的临时表) MATERIALIZED materialized_from_subquery 物化子查询 UNCACHEABLE SUBQUERY cacheable (false) 无法缓存结果的子查询,必须对外部查询的每一行进行重新计算 UNCACHEABLE UNION cacheable...
Oracle的MySQL是一个流行的基于结构化查询语言(SQL)的开源关系数据库管理系统。它经常与PHP一起使用,以增强网站的功能。PHP预装在Mac电脑上,而MySQL没有。 当您创建和测试需要MySQL数据库的软件或网站时,在您的计算机上安装MySQL非常方便。在Mac上安装MySQL比您预期的要容易,特别是如果您使用本机安装包而不是TAR包,这需要在终端模式下访问和更改命令行。(推荐:《MySQL教程》) 使用本机安装包安装MySQL Mac的免费下载是MySQL社区服务器版。 1、到MySQL网站下载最新版本的Mac for MacOS。选择本机程序包DMG存档版本,而不是压缩的TAR版本。 2、单击您选择的版本旁边的“ 下载”按钮。 3、提示您注册一个Oracle Web帐户,但是除非您需要,否则单击No thanks,启动我的下载。 4、在下载文件夹中,找到并双击file图标以装入.dmg存档文件,其中包含安装程序。 5、双击MySQL软件包安装程序的图标。 6、阅读打开的对话框屏幕,然后单击Continue开始安装。 7、阅读许可条款。单击“继续”,然后同意继续。 8、点击Install。 9、记录安装过程中显示的临时密码。无法恢复此密码。你必须保存它。登录MySQL后,系统会提示您创建一个新密码。 10、按下Summary屏幕上的Close以完成安装。 MySQL网页包含了该软件的文档、说明和更改历史记录。 如何在Mac上启动SQL? MySQL服务器安装在Mac上,但默认情况下不加载。通过使用MySQL首选项窗格单击Start启动MySQL,该首选项窗格是在默认安装期间安装的。您可以使用MySQL首选项窗格将MySQL配置为在打开计算机时自动启动。 以上就是如何在Mac上安装MySQL?的详细内容,更多请关注php中文网其它相关文章!
本篇文章主要给大家介绍在mysql中如何解码base64编码的字符串,那么我们可以通过FROM_BASE64()函数来实现解码。 在MySQL中,FROM_BASE64()函数解码一个base-64编码的字符串并返回结果。更具体地说,它接受一个用TO_BASE64()使用的base-64编码规则编码的字符串,并以二进制字符串的形式返回解码后的结果。 FROM_BASE64()语法如下: FROM_BASE64(str) 其中参数str是你希望解码的以base-64编码的字符串。 例1 -基本用法 下面是一个例子来演示基本用法: SELECT FROM_BASE64('Q2F0'); 结果: +---------------------+ | FROM_BASE64('Q2F0') | +---------------------+ | Cat | +---------------------+ 在这个例子中,我们的参数是Q2F0,它是Cat的base-64编码字符串。 我们可以通过将Cat传递给TO_BASE64()函数得到base-64编码的字符串: SELECT TO_BASE64('Cat'); 结果: +------------------+ | TO_BASE64('Cat') | +------------------+ | Q2F0 | +------------------+ 例2 -一个较长的字符串 下面是一个使用更长的字符串的例子: SELECT FROM_BASE64('TXkgY2F0IGxpa2VzIHRvIGNoYXNlIGVsZXBoYW50cyE='); 结果: +-------------------------------------------------------------+ | FROM_BASE64('TXkgY2F0IGxpa2VzIHRvIGNoYXNlIGVsZXBoYW50cyE=') | +-------------------------------------------------------------+ | My cat likes to chase elephants! | +-------------------------------------------------------------+ 例3 -无效参数 如果参数不是有效的base-64字符串,则返回NULL: SELECT FROM_BASE64('Oops!'); 结果: +----------------------+ | FROM_BASE64('Oops!') | +----------------------+ | NULL | +----------------------+ 例4 -NULL参数 如果你传入NULL,你也会得到NULL: SELECT FROM_BASE64(NULL); 结果: +-------------------+ | FROM_BASE64(NULL) | +-------------------+ | NULL | +-------------------+ 例5 -缺少参数 如果你不传递一个参数,你会得到一个错误: SELECT FROM_BASE64(); 结果: ERROR 1582 (42000): Incorrect parameter count in the call to native function 'FROM_BASE64' 例6 -参数太多 如果你传入太多的参数,你也会得到一个错误: SELECT FROM_BASE64('Q2F0', 'RWxlcGhhbnQ='); 结果: ERROR 1582 (42000): Incorrect parameter count in the call to...
Linux tail命令显示一个或多个文件或管道数据的最后一部分(默认为10行);可用于实时监控文件更改。下面本篇文章就来就来给大家介绍一下如何使用Linux tail命令,希望对大家有所帮助。 Linux tail命令 tail命令显示一个或多个文件或管道数据的最后一部分(默认为10行);可用于实时监控文件更改。tail命令最常见的用途之一就是监视和分析日志和其他随时间变化的文件,通常与grep等其他工具结合使用。 基本语法: tail [OPTION]... [FILE]... OPTION: tail选项,下面我们来看看最常见的一些选项。 ● -n(–lines)选项:指定要显示的行数 ● -c(–bytes)选项:指定要显示的特定字节数 ● -f(–follow)选项:监视文件的更改 FILE:零个或多个输入文件名。如果未指定FILE,或者FILE为-,则tail将读取标准输入。 如何使用tail命令? 在没有任何选项的情况下使用最简单的形式时,tail命令将显示最后10行。 tail filename.txt 如何显示特定行数? 可以使用-n(–lines)选项来指定要显示的行数: tail -n <NUMBER> filename.txt 也可以省略字母n,只使用连字符(-)和数字(它们之间没有空格)。 要显示名为filename.txt的文件的最后50行,需要使用: tail -n 50 filename.txt 以下示例将显示与上述命令相同的结果: tail -50 filename.txt 如何显示特定的字节数? 可以使用-c(–bytes)选项来显示特定的字节数: tail -c <NUMBER> filename.txt 例如,要显示文件filename.txt中最后500个字节的数据,我们可以使用: tail -c 500 filename.txt 还可以在数字后面使用乘数后缀来指定要显示的字节数。 b乘以512,kB乘以1000,K乘以1024,MB乘以1000000,M乘以1048576,依此类推。 以下命令将显示文件filename.txt的最后两千字节(2048): tail -c 2k filename.txt 如何查看文件以进行更改? 要监视文件的更改,需要使用-f(–follow)选项: tail -f filename.txt -f选项对于监视日志文件特别有用。 例如,要显示/var/log/nginx/error.log文件的最后10行,并监视该文件是否有要使用的更新: tail -f /var/log/nginx/error.log 要在监视文件时中断tail命令,需要按ctrl+c。 要在重新创建文件时继续监视该文件,需要使用-f选项: tail -F filename.txt -f选项在tail命令跟随旋转的日志文件时非常有用。当与-f选项一起使用时,tail命令将在文件再次可用时重新打开。 如何显示多个文件 如果有多个文件作为tail命令的输入提供,它将显示每个文件的最后十行。 tail filename1.txt filename2.txt 用户可以使用与显示单个文件时相同的选项。 例如:显示文件filename1.txt和filename2.txt的最后20行 tail -c 20 filename1.txt filename2.txt 如何和其他命令一起使用? tail命令可以与其他命令结合使用,例如,要监视Apache访问日志文件,并且只显示包含IP地址192.168.42.12的行,可以使用: tail -f /var/log/apache2/access.log | grep 192.168.42.12 或者显示按CPU使用率排序的前十个运行进程: ps aux | sort -nk +3 | tail -5 相关视频教程推荐:《Linux教程》 以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。
cPanel / WHM是一个基于Web的控制面板,用于管理完整的Linux操作系统。所有cPanel帐户都是使用一个主域创建的。本篇文章将介绍更改cPanel用户主域的文档。 必须具有root shell访问权限才能更改cPanel中的主/主域文档根目录,请使用以下步骤在cPanel帐户中更改主域的文档根目录。 (推荐:Linux视频教程) 优先权:必须具有对cpanel服务器的根用户的ssh访问权。 步骤1:登录到CPanel服务器 使用ssh以根帐户的形式获取服务器的shell访问,使用您最喜欢的ssh客户机。使用Putty连接了服务器。现在编辑以下文件。 # vim /var/cpanel/userdata/USERNAME/DOMAINNAME.COM 步骤2:更新documentoot 编辑文件后,根据需要搜索文本文档根并更改路径。 documentroot: /home/USERNAME/public_html/NEW_PATH 步骤3:重建并重新启动Apache 在进行更改之后,我们需要重建Apache配置文件并重新启动Apache服务器。使用以下命令执行此操作。 # /scripts/rebuildhttpdconf # service httpd restart 完成了。 本篇文章到这里就已经全部结束了,
C是一种用于开发系统软件的强大编程语言。本篇文章将介绍关于通过命令行在Linux系统中运行C和C ++程序。在本篇文章中,我们使用GCC(GNU Compiler Collection)的’gcc’和’g ++’命令来编译C / C ++程序。 gcc是GCC中的GNU C编译器。 g ++是GCC中的GNU C ++编译器。 安装开发工具 要运行C程序,必须在Linux系统上安装了开发工具包。运行以下命令之一,根据你的操作系统安装开发工具包。 $ sudo yum groupinstall "Development Tools" ## 基于Redhat的系统 $ sudo apt-get install build-essential ## 基于Debian的系统 C语言示例 例如,编写Hello World的代码。 #include <stdio.h> int main() { printf("Hello World!"); return 0; } 在系统上创建一个新文件,如下所示: $ vim helloworld.c 在Linux中编译并运行C / C ++程序 使用GNU C编译器编译上面的hello world程序如下: $ gcc helloworld.c -o hello 使用C ++编译编写以下命令。 $ g++ helloworld.c -o hello 以上命令将在当前目录中创建名为hello的可执行文件。您可以直接运行与其他命令相同的操作 $ ./hello 你还可以复制bin目录(/ usr / local / bin)下的文件,以使它们可以在系统范围内访问。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。 Linux 有五个重启命令 1、shutdown shutdown是最常用也是最安全的关机和重启命令,它会在关机之前调用fsck检查磁盘,其中-h和-r是最常用的参数: -h:停止系统服务并关机 -r: 停止系统服务后重启 2、poweroff poweroff表示立即关机,效果等同于shutdown -h now,在多用户模式下(Run Level 3)不建议使用。 3、init 语法:init(选项)(参数) -b:不执行相关脚本而直接进入单用户模式; -s:切换到单用户模式。 0 停机(千万不能把initdefault 设置为0) 1 单用户模式 2 多用户,没有 NFS(和级别3相似,会停止部分服务) 3 完全多用户模式 4 没有用到 5 x11(Xwindow) 6 重新启动(千万不要把initdefault 设置为6) 4、reboot reboot表示立即重启,效果等同于shutdown -r now 5、halt 不理会目前系统状况下,进行硬件关机,一般不建议使用。 本篇文章就是关于Linux 重启命令的介绍