一台mysql实例 可以创建多少mysql数据库

一台mysql实例 可以创建多少mysql数据库,第1张

本质上对创建数据库没有限制,可以使用实例副本进行创建。

大多情况下,需要可靠而有效地克隆 MySQL 实例数据。这包括 MySQL 高可用的解决方案,其中需要在将实例加入组复制集群之前配置实例,或者在经典复制模型中将其添加为 Slave。

为复制拓扑而创建 MySQL 副本一直很麻烦。涉及的步骤很多,首先要备份 MySQL 服务器,通过网络将备份传输到我们想要添加到复制集的新 MySQL 节点,然后在该节点上恢复备份并手动启动 MySQL 服务器。为了高可用,最好还要将其正确设置备份的 GTID,并启动并运行群集。涉及的手动步骤数量过多不利于高可用。CLONE 插件解决了这个问题并简化了副本配置。使您可以使用 MySQL 客户端(和 SQL 命令)来配置新节点并在发生时观察克隆进度。无需手动处理多个步骤并维护自己的基础架构来配置新的 MySQL 节点。

MySQL 8.0.17 引入了 CLONE SQL 语句,使当前的 MySQL 服务器成为另一个运行在不同节点的 MySQL 服务器的“克隆”。我们将执行 clone 语句的服务器实例称为“受体”。克隆的源服务器实例称为“供体”。供体克隆以一致的快照存储在 InnoDB 存储引擎中的所有数据和元数据,以替换受体中的数据。

成功执行 CLONE SQL 语句后,将自动重新启动受体服务器。重新启动涉及恢复克隆的快照数据,就像用老方法复制数据一样。恢复完成后,受体就是供体的克隆版,随时可以使用!

这里有一些关于克隆过程的重要注意事项。

不克隆 MySQL 配置参数,并且受体保留所有原始配置参数,如克隆之前。这样做是因为许多配置可能特定于节点(例如 PORT),因此保留它们似乎是一个不错的选择。另一方面,一些存储配置确实需要在供体和受体之间匹配(例如 innodbpagesize),如果这样的配置参数不匹配,CLONE 将报告错误。

CLONE 插件不会克隆二进制日志。

CLONE 插件目前仅支持 InnoDB 存储引擎。在其他存储引擎(如 MyISAM 和 CSV)中创建的表将被克隆为空表。克隆基础架构的设计允许克隆 MySQL 支持的任何存储引擎。但是,只有 InnoDB 序列化和反序列化方法已经实现并经过测试。

克隆会阻止供体中的所有并发 DDL。

需要注意的事实是受体放弃所有数据以及任何二进制日志,以便成为供体实例的克隆。在执行 CLONE 之前,如果认为有必要,需要备份当前受体数据。

1.合理使用索引

索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:

●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

●在频繁进行排序或分组(即进行group by或order by *** 作)的列上建立索引。

●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁 *** 作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

2.避免或简化排序

应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

●索引中不包括一个或几个待排序的列;

●group by或order by子句中列的次序与索引的次序不一样;

●排序的列来自不同的表。

为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

3.消除对大型表行数据的顺序存取

在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序 *** 作:

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

SELECT * FROM orders WHERE customer_num=104 AND order_num>1001

UNION

SELECT * FROM orders WHERE order_num=1008

这样就能利用索引路径处理查询。

4.避免相关子查询

一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

5.避免困难的正规表达式

MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”

即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

6.使用临时表加速查询

7.用排序来取代非顺序存取

本文实例讲述了php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率。分享给大家供大家参考,具体如下:

<?php

/**

*

测试pdo和mysqli的执行效率

*/

header("Content-type:text/htmlcharset=utf-8")

//通过pdo链接数据库

$pdo_startTime

=

microtime(true)

$pdo

=

new

PDO("mysql:host=localhostdbname=test","root","1234",array(PDO::MYSQL_ATTR_INIT_COMMAND

=>

"SET

NAMES'utf8'"))

for($i=1$i<=100$i++){

$title

=

"pdo标题".$i

$content

=

"pdo内容".$i

$addtime

=

time()

$user_id

=

$i

$pdo_sql

=

"INSERT

INTO

`article`(`title`,`content`,`addtime`,`user_id`)

VALUES(:title,:content,:addtime,:user_id)"

$sth

=

$pdo->prepare($pdo_sql)

$sth->bindParam(':title',$title)

$sth->bindParam(':content',$content)

$sth->bindParam(':addtime',$addtime)

$sth->bindParam(':user_id',$user_id)

$sth->execute()

}

$pdo_endTime

=

microtime(true)

$pdo_time

=

$pdo_endTime

-

$pdo_startTime

echo

$pdo_time

echo

"<hr/>"

//通过mysql链接数据库

$mysqli_startTime

=

microtime(true)

$mysqli

=

mysqli_connect("localhost","root","1234","test")

or

die("数据连接失败")

mysqli_query($mysqli,"set

names

utf8")

for($i=1$i<=100$i++){

$title

=

"mysqli标题".$i

$content

=

"mysqli内容".$i

$addtime

=

time()

$user_id

=

$i

$sql

=

"INSERT

INTO

`article`(`title`,`content`,`addtime`,`user_id`)

VALUES('".$title."','".$content."',".$addtime.",".$user_id.")"

mysqli_query($mysqli,$sql)

}

$mysqli_endTime

=

microtime(true)

$mysqli_time

=

$mysqli_endTime

-

$mysqli_startTime

echo

$mysqli_time

echo

"<hr/>"

if($pdo_time

>

$mysqli_time){

echo

"pdo的执行时间是mysqli的".round($pdo_time/$mysqli_time)."倍"

}else{

echo

"mysqli的执行时间是pdo的".round($mysqli_time/$pdo_time)."倍"

}

测试结果:其实经过多次测试,pdo和mysqli的执行效率差不多。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基于pdo *** 作数据库技巧总结》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库 *** 作入门教程》及《php常见数据库 *** 作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例php中数据库连接方式pdo和mysqli对比分析php中关于mysqli和mysql区别的一些知识点分析php *** 作mysqli(示例代码)php封装的mysqli类完整实例PHP以mysqli方式连接类完整代码实例php简单解析mysqli查询结果的方法(2种方法)php中mysql连接方式PDO使用详解Php中用PDO查询Mysql来避免SQL注入风险的方法php

mysql

PDO

查询 *** 作的实例详解PHP实现PDO的mysql数据库 *** 作类


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/8619484.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-18
下一篇2023-04-18

发表评论

登录后才能评论

评论列表(0条)

    保存