为什么PHP不能从从mysql读取大数据

为什么PHP不能从从mysql读取大数据,第1张

多大的数据叫大数据啊?只能说数据越大读得越慢,但只要给足够的内存、足够的时间,再大的数据也能读出来。

你所说的这个问题,应该不是PHP和mysql的问题,任何程序语言,任何数据库,在硬件限制和执行时间限制的情况下,数据无限增大,都终究会读不出来。

利用cast()函数,将varchar类型转换为integer类型。

cast()函数用法:

cast(数据名称 as 要转换的类型)

CAST() 函数可用来获取一个值,并产生这个值的另一个类型的值。

这个类型 可以是以下值其中的 一个:

BINARY[(N)]

CHAR[(N)]

DATE

DATETIME

DECIMAL

SIGNED [INTEGER]

TIME

UNSIGNED [INTEGER]

照你的需求来看,可以有两种方式,一种是分表,另一种是分区 首先是分表,就像你自己所说的,可以按月分表,可以按用户ID分表等等,至于采用哪种方式分表,要看你的业务逻辑了,分表不好的地方就是查询有时候需要跨多个表。 然后是分区,分区可以将表分离在若干不同的表空间上,用分而治之的方法来支撑无限膨胀的大表,给大表在物理一级的可管理性。将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能。分区的好处是分区的优点: 1 增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍然可以使用; 2 减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,故能比整个大表修复花的时间更少; 3 维护轻松:如果需要重建表,独立管理每个分区比管理单个大表要轻松得多; 4 均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能; 5 改善性能:对大表的查询、增加、修改等 *** 作可以分解到表的不同分区来并行执行,可使运行速度更快; 6 分区对用户透明,最终用户感觉不到分区的存在。

楼主可以参考下列例句:

列出所有年龄最大的学生资料

select from students

where date_of_birth=

(select max date_of_birth

from students);

或者

select a from students a

where not exists (

select 1 from students b

where bdate _of_birth >adate_of_birth);

第二种写法在有索引可被利用时效率很高,可作为首选,但是无索引可被利用且是大数据表的情况下效率很低,此时应避免使用。

MySQL数据库limit分页示例

1selectfrompersonslimitA,B;

解释:

A,查询起点

B,需要的行数

2示例:

selectfrompersonslimit0,4;

解释:

起点位置为0,开始查询,返回4条数据。

selectfrompersonslimit4,4;

解释:

起点为4,开始查询,返回4天数据。

3特殊:

selectfrompersonslimit10;

意思是,起点为0,开始查询,返回10条记录。

与selectfrompersonslimit0,10;是等价的。

4按规则排序的同时,进行分页:

selectfrompersons

orderbylastname

limit0,10;

ID已经设为主键了

200万的表跟4万的表,除非你系统的硬盘、内存、CPU配置特低,否则,效率上不至于你说的那么慢的(我普通的台式机CPU为15G的都不至于那么慢)

肯定有优化的余地,hi我吧

大数据并发处理解决方案:

1、HTML静态化

效率最高、消耗最小的就是纯静态化的html页面,所以尽可能使网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,无法全部手动去挨个实现,于是出现了常见的信息发布系统CMS,像常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

2、服务器分离

对于Web服务器来说,不管是Apache、IIS还是其他容器,是最消耗资源的,于是有必要将与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的服务器,甚至很多台服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为问题而崩溃,在应用服务器和服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率。 这一实现起来是比较容易的一现,如果服务器集群 *** 作起来更方便,如果是独立的服务器,新手可能出现上传只能在服务器本地的情况下,可以在令一台服务器设置的IIS采用网络路径来实现服务器,即不用改变程序,又能提高性能,但对于服务器本身的IO处理性能是没有任何的改变。

3、数据库集群和库表散列

大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是需要使用数据库集群或者库表散列。

4、缓存

缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。

网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,net不是很熟悉,相信也肯定有。

5、镜像

镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。

6、负载均衡

负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。 负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择。

硬件四层交换

第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有>

行格式为Compact是如何存储大数据的:

[vb] view plain copy

mysql> select version();

+-----------+

| version() |

+-----------+

| 5173    |

+-----------+

1 row in set (001 sec)

mysql> show table status like 'row'\G;

 1 row 

Name: row

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 1

Avg_row_length: 81920

Data_length: 81920

Max_data_length: 0

Index_length: 0

Data_free: 0

Auto_increment: NULL

Create_time: 2017-01-04 21:46:02

Update_time: NULL

Check_time: NULL

Collation: latin1_swedish_ci

Checksum: NULL

Create_options:

Comment:

1 row in set (000 sec)

我们建立一张测试表,插入数据:

[html] view plain copy

CREATE TABLE `row` (

`content` varchar(65532) NOT NULL DEFAULT ''

) ENGINE=InnoDB DEFAULT CHARSET=latin1

mysql> insert into row(content) select repeat('a',65532);

Query OK, 1 row affected (003 sec)

Records: 1  Duplicates: 0  Warnings: 0

我们使用 py_innodb_page_infopy 工具来查看表中的页分布:

[vb] view plain copy

[root@localhost mysql]# python py_innodb_page_infopy -v com/rowibd

page offset 00000000, page type <File Space Header>

page offset 00000001, page type <Insert Buffer Bitmap>

page offset 00000002, page type <File Segment inode>

page offset 00000003, page type <B-tree Node>, page level <0000>

page offset 00000004, page type <Uncompressed BLOB Page>

page offset 00000005, page type <Uncompressed BLOB Page>

page offset 00000006, page type <Uncompressed BLOB Page>

page offset 00000007, page type <Uncompressed BLOB Page>

Total number of page: 8:

Insert Buffer Bitmap: 1

Uncompressed BLOB Page: 4

File Space Header: 1

B-tree Node: 1

File Segment inode: 1

可以看出,第4页的 <B-tree Node>, page level <0000> 格式为数据页,存放着MySQL的行数据。 <Uncompressed BLOB Page> 可以理解为MySQL存放大数据的地方,暂且叫作外部存储页。Compact格式没有将大数据全部放在数据页中,而是将一部分数据放在了外部存储页中。那么,是全部数据在外部存储页中,还是一部分数据。假如是一部分数据,这一部分是多少呢?

我们使用 hexdump -Cv rowibd 查看一下数据页 <B-tree Node>, page level <0000> ,也就是第4页:

[vb] view plain copy

3073 0000c000  8c 25 17 57 00 00 00 03  ff ff ff ff ff ff ff ff  |%W|

3074 0000c010  00 00 00 00 00 07 3a b8  45 bf 00 00 00 00 00 00  |:E|

3075 0000c020  00 00 00 00 00 02 00 02  03 a6 80 03 00 00 00 00  ||

3076 0000c030  00 7f 00 05 00 00 00 01  00 00 00 00 00 00 00 00  ||

3077 0000c040  00 00 00 00 00 00 00 00  00 13 00 00 00 02 00 00  ||

3078 0000c050  00 02 00 f2 00 00 00 02  00 00 00 02 00 32 01 00  |2|

3079 0000c060  02 00 1c 69 6e 66 69 6d  75 6d 00 02 00 0b 00 00  |infimum|

3080 0000c070  73 75 70 72 65 6d 75 6d  14 c3 00 00 10 ff f1 00  |supremum|

3081 0000c080  00 00 00 04 03 00 00 00  00 13 12 80 00 00 00 2d  |-|

3082 0000c090  01 10 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaa|

3083 0000c0a0  61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaaaa|

3084 0000c0b0  61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaaaa|

3085 0000c0c0  61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaaaa|

3128 0000c370  61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaaaa|

3129 0000c380  61 61 61 61 61 61 61 61  61 61 61 61 61 61 61 61  |aaaaaaaaaaaaaaaa|

3130 0000c390  61 61 00 00 00 02 00 00  00 04 00 00 00 26 00 00  |aa&|

3131 0000c3a0  00 00 00 00 fc fc 00 00  00 00 00 00 00 00 00 00  ||

3132 0000c3b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ||

3133 0000c3c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ||

3134 0000c3d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ||

4093 0000ffc0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ||

4094 0000ffd0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ||

4095 0000ffe0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ||

4096 0000fff0  00 00 00 00 00 70 00 63  01 a1 6c 2b 00 07 3a b8  |pcl+:|

以上就是关于为什么PHP不能从从mysql读取大数据全部的内容,包括:为什么PHP不能从从mysql读取大数据、mysql 怎样取得varchar类型的数据的最大值、利用MySQL数据库如何解决大数据量存储问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9396073.html

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

发表评论

登录后才能评论

评论列表(0条)

保存