扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Python 有 NumPy、pandas、matplotlib、SciPy、SymPy... PHP 有什么?
创新互联专业为企业提供大冶网站建设、大冶做网站、大冶网站设计、大冶网站制作等企业网站建设、网页设计与制作、大冶企业网站模板建站服务,十多年大冶做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
看出版的图书便可知
python@z.cn
php@z.cn
差异在于两种语言的设计初衷以及语言生态(第三方库、其他的软硬件支持等),PHP 更多地用于 Web 开发,Python 虽然也有一些 Web 框架,但相比于 PHP 来说,入门相对难、生态环境差...
所以无论是差异或是优缺点,都不在语言本身,而在于语言生态。
性能指标,无非时间复杂度和空间复杂度。决定性能的,只有算法和硬件。而且解释型语言并不存在真正的数据结构,所以,只能从算法上优化。
一、简述一下MongoDB的应用场景
mongodb 支持副本集、索引、自动分片,可以保证较高的性能和可用性。
更高的写入负载
默认情况下,MongoDB 更侧重高数据写入性能,而非事务安全,MongoDB 很适合业务系统中有大量 “低价值” 数据的场景。但是应当避免在高事务安全性的系统中使用 MongoDB,除非能从架构设计上保证事务安全。
高可用性
MongoDB 的复副集 (Master-Slave) 配置非常简洁方便,此外,MongoDB 可以快速响应的处理单节点故障,自动、安全地完成故障转移。这些特性使得 MongoDB 能在一个相对不稳定(如云主机)的环境中,保持高可用性。
数据量很大或者未来会变得很大
依赖数据库 (MySQL) 自身的特性,完成数据的扩展是较困难的事,在 MySQL 中,当一个单达表到 5-10GB 时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用 MySQL 通常需要借助驱动层或代理层完成这类需求。而 MongoDB 内建了多种数据分片的特性,可以很好地适应大数据量的需求。
基于位置的数据查询
MongoDB 支持二维空间索引,因此可以快速及精确地从指定位置获取数据。
表结构不明确
在一些传统 RDBMS 中,增加一个字段会锁住整个数据库 / 表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级。通常发生在数据表大于 1G 的时候(当大于 1TB 时更甚)。 因 MongoDB 是文档型数据库,为非结构货的文档增加一个新字段是很快速的操作,并且不会影响到已有数据。另外一个好处当业务数据发生变化时,是将不再需要由 DBA 修改表结构。
二、数据库设计经验,为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?
1、为什么要分表
当一张表的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。
分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
2、分表的方案
做 mysql 集群,有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个,这样等待时间是不是大大的缩短了呢?
linux mysql proxy 的安装,配置,以及读写分离
mysql replication 互为主从的安装及配置,以及数据同步
优点:扩展性好,没有多个分表后的复杂操作(php 代码)
缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大。
三、简述一下数据库主从复制,读写分离
* 什么是主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;
* 主从复制的原理:
1.数据库有个bin-log二进制文件,记录了所有的sql语句。
2.只需要把主数据库的bin-log文件中的sql语句复制。
3.让其从数据的relay-log重做日志文件中再执行一次这些sql语句即可。
* 主从复制的作用
1.做数据的热备份,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问频率,提高单机的I/O性能
3.主从复制是读写分离的基础,使数据库能制成更大 的并发。例如子报表中,由于部署报表的sql语句十分慢,导致锁表,影响前台的服务。如果前台服务使用master,报表使用slave,那么报表sql将不会造成前台所,保证了前台的访问速度。
* 主从复制的几种方式:
1.同步复制:所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回。
2.异步复制:如同AJAX请求一样。master只需要完成自己的数据库操作即可。至于slaves是否收到二进制日志,是否完成操作,不用关心。MYSQL的默认设置。
3.半同步复制:master只保证slaves中的一个操作成功,就返回,其他slave不管。
这个功能,是由google为MYSQL引入的。
* 关于读写分离
在完成主从复制时,由于slave是需要同步master的。所以对于insert/delete/update这些更新数据库的操作,应该在master中完成。而select的查询操作,则落下到slave中。
目前主流的编程软件VisualBasic的版本是VisualBasic 6.0专业版。我们所使用的操作系统是Windows10。
先把VisualBasic 6.0的安装光盘放入电脑的光盘驱动器中,通常电脑能够自动运行光盘上的安装程序。在安装VisualBasic之前,最好先详细地阅读一下光盘上的Readme.txt文件,了解安装VisualBasic 6.0需要的一些基本知识,然后单击光盘上的Setup.exe文件,并按照安装程序的提示进行操作。
首先,安装程序会显示一个启动画面。如果使用的是不同的安装盘,也许Readme文件的格式可能有所不同,但是不影响应用程序的安装。
在上面的对话框中可以直接单击对话框上的【下一步】按钮,进入下面的操作。这时会进入一个显示微软的最终用户许可协议书的窗口,里面的内容规定了最终用户的一些必要的义务。在这里只能选择同意,因为如果选择不同意,安装程序就退出了。
在下面的窗口中,将要求用户输入用户名和所属的公司名称,并输入产品的ID号。这个ID号应该包含在购买的光盘中。输入相应的信息之后,单击【下一步】按钮。如果输入的ID号正确,那么将进入VisualBasic 6.0安装程序的下一个窗口,在这里有两个选项,对话框中对这两个选项进行了必要的解释。在这里选择第一个选项,也是安装程序的默认选项。
单击【下一步】按钮,进入安装程序的下一个对话框。在这个对话框中,安装程序要求选择VisualBasic 6.0应用程序的公共文件的安装路径。在这里可以根据自己的需要把应用程序安装到希望的路径中。在完成了路径的选择之后,单击【下一步】按钮,进入安装程序的下一步操作。ß这时完成了安装程序的初始配置,现在进入了真正和VisualBasic 6.0相关的安装程序,在经过一段初始化操作之后,安装程序将显示选择安装类型的对话框。
在这个对话框中,要进行两个操作,一个是选择VisualBasic 6.0系统的安装路径,第二个是选择程序的安装类型。这里同样可以任意指定程序的安装位置,比如指定到“E:/VB”。在选择安装类型的时候,有两个选择:典型安装,是安装程序根据最常用的选项安装,第二项是允许根据需要来配置安装选项。
单击【自定义安装】按钮,会显示设置安装选项的对话框。
在左边的列表框中选中或者清除复选框,就表示要或者不要安装相应的组件。单击对话框右边的【更改选项】按钮,可以进行更为细致的设置。
选择好了需要的选项之后,单击【继续】按钮,可以开始复制VisualBasic 6.0的文件,当程序复制完所有的文件,并进行相应的系统配置之后,就会要求重新启动Windows,按照要求重新启动系统之后,VisualBasic 6.0的安装工作就基本完成了。
在重新启动电脑之后,系统会询问是否安装MSDN,这是VisualBasic 6.0的帮助系统,可以根据自己的需要安装这个系统。
希望我能帮助你解疑释惑。
mysql_query函数查询的方式是查询出全部结果后缓存到内存中,这样就会出现超内存的现象,使用另外一个函数mysql_unbuffered_query可以解决这个问题,mysql_unbuffered_query不会缓存结果集,而是查询出来数据后立马对结果集进行操作,也就是便查询边返回,这样就不会出现超出内存的现象,但是使用mysql_unbuffered_query的是时候不能使用 mysql_num_rows() 和 mysql_data_seek()。并且向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。例如:
使用缓存结果集的代码:
function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用缓存结果集方式
// $pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo-prepare('select * from test');
$sth-execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth-fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e-getMessage();
}
}
执行时将会报超出内存的错误:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 56
Call Stack:
0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
0.0005 135568 2. test-selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:85
0.0050 142528 3. PDOStatement-execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:56
将上面代码中的$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注释去掉后将不在缓存结果集,这时运行该函数的结果如下:
最初占用内存大小:144808
Array
(
[id] = 1
[a] = v
[b] = w
[c] = i
)
占用内存大小:145544
Array
(
[id] = 2
[a] = b
[b] = l
[c] = q
)
占用内存大小:145544
Array
(
[id] = 3
[a] = m
[b] = p
[c] = h
)
占用内存大小:145536
Array
(
[id] = 4
[a] = j
[b] = i
[c] = b
)
占用内存大小:145536
可以看到,这时返回一条数据内存占用非常的小,也就700多字节,这样就不会出现超出内存的错误了。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流