佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 914|回复: 11

用PHP自编数据库

[复制链接]
发表于 7-1-2017 09:48 PM | 显示全部楼层 |阅读模式
本帖最后由 小彪 于 7-1-2017 09:54 PM 编辑

我用fopen, fwrite, strpos, strstr等做数据库。一个file为一table。类似mysql的myd file。但我的格式是
a1 | b1 | c1
a2 | b2 | c2
.
.
.
10万行

注释:
| = chr(30)

开file巡回所有10万行和一个判断是否相等的语句才用0.3s。可是要把一行分割成column,必须要explode,或strstr,strpos等。单单加入一行最快的strpos,整个结果就多了2秒钟半。mysql 比我的快一倍。

有没有办法做到跟mysql一样快?
回复

使用道具 举报


ADVERTISEMENT

发表于 8-1-2017 10:07 AM | 显示全部楼层
我覺得你的想法很有意思.我覺得有可能.
先說理論. database engine的出現是為了能在"大型"的database能比較快速的retrieve data,比較簡單的操作data(用SQL),比較容易維持(backup, roll back, concurrent access等等).
在你的data少的情形之下,你不用通過database engine,是有可能file base快過database的.
但filebase一般上是不利于快速retrieve data,因為data排列是根據time stamp.也沒indexing之類的.
你參考就好.祝順利

回复

使用道具 举报

发表于 8-1-2017 05:27 PM | 显示全部楼层
改用Assembly写,然后接口,或许有可能。
至于PHP 楼主是用object oriental还是structural?
如果是structural还无法快过MySQL不如考虑,其他比如C等。做DLL接进去。
回复

使用道具 举报

 楼主| 发表于 9-1-2017 04:05 PM | 显示全部楼层
为人民服务 发表于 8-1-2017 05:27 PM
改用Assembly写,然后接口,或许有可能。
至于PHP 楼主是用object oriental还是structural?
如果是structural还无法快过MySQL不如考虑,其他比如C等。做DLL接进去。

排写,请问structural是什么?
回复

使用道具 举报

发表于 9-1-2017 06:23 PM | 显示全部楼层
小彪 发表于 9-1-2017 04:05 PM
排写,请问structural是什么?

structural就是Procedural。比如:
mysqli::query是Object oriented
mysqli_query就是Structural/Procedural
回复

使用道具 举报

 楼主| 发表于 14-1-2017 01:20 PM | 显示全部楼层
yan13 发表于 8-1-2017 10:07 AM
我覺得你的想法很有意思.我覺得有可能.
先說理論. database engine的出現是為了能在"大型"的database能比較快速的retrieve data,比較簡單的操作data(用SQL),比較容易維持(backup, roll back, concurrent access等等 ...

indexing是人工整理出来的系统,mysql本身只是单纯添加新数据在一个file的尾端,对吗?
我意思是人工分成字首为A到Z的table,或者以其他组别分类。
所以mysql本身不具有indexing功能。对吗?
回复

使用道具 举报

Follow Us
发表于 14-1-2017 02:07 PM | 显示全部楼层
小彪 发表于 14-1-2017 01:20 PM
indexing是人工整理出来的系统,mysql本身只是单纯添加新数据在一个file的尾端,对吗?
我意思是人工分成字首为A到Z的table,或者以其他组别分类。
所以mysql本身不具有indexing功能。对吗?

先看看這個
https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html
再看看這個
http://blog.csdn.net/timchen525/article/details/51559878
比較深入點的你可以看看為什麼field需要分成fixed length.他們為了能夠比較快速的處理data真的花了不少心血.
CSV比較明顯的問題是,如果你的data帶有seprator要怎麼處理.都是相當有趣的
祝順利
回复

使用道具 举报

发表于 14-1-2017 02:18 PM 来自手机 | 显示全部楼层
xml有沒有可能?

回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 16-1-2017 06:49 PM | 显示全部楼层
yan13 发表于 14-1-2017 02:07 PM
先看看這個
https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html
再看看這個
http://blog.csdn.net/timchen525/article/details/51559878
比較深入點的你可以看看為什麼field需要分成fixed le ...

所以indexing是用在多个table。
SELECT table2.name WHERE table1.name='a' AND table2.id=table1.id
先执行 table1.name='a',得到result,然后执行 table2.id=result。这个result就是所谓的index。

如果是 SELECT table2.name WHERE table2.id=table1.id 就不需要index了。

我的理解对吗?



回复

使用道具 举报

发表于 17-1-2017 06:03 AM | 显示全部楼层
小彪 发表于 16-1-2017 06:49 PM
所以indexing是用在多个table。
SELECT table2.name WHERE table1.name='a' AND table2.id=table1.id
先执行 table1.name='a',得到result,然后执行 table2.id=result。这个result就是所谓的index。

如果是  ...

如果我正確的了解你的意思,對的.
我知道的是老法子,現在用什麼indexing我沒去查.
新的data會save在最新也就是最下面的row.因為如果你要順著次序來save的話,就會慢了.但是你會有一個index table,裡面有index,比如說第一排是row4(或row 4是第幾個byte),第2排是什麼之類.


譬如你有一個table,如果你沒indexing的話,你需要讀完整個table(file),才能拿到select * from table1 where name = 'a'的result.
Column
name,desc,remark


Data
a | b1 | c1
a | b2 | c2
b | b1 | c1
b | b2 | c2

c | b1 | c1
c | b2 | c2

如果你有indexing的話,你就會知道只需要讀第1和2row(或byte count).data少時看不出來,data一多了indexing的好處就明顯了.
我認為于個人的能力是可能做得出來的,不過要花時間.你也可以參考看看open source的database engine.


祝順利




回复

使用道具 举报

 楼主| 发表于 20-1-2017 06:08 PM | 显示全部楼层
本帖最后由 小彪 于 20-1-2017 06:19 PM 编辑
yan13 发表于 17-1-2017 06:03 AM
如果我正確的了解你的意思,對的.
我知道的是老法子,現在用什麼indexing我沒去查.
新的data會save在最新也就是最下面的row.因為如果你要順著次序來save的話,就會慢了.但是你會有一 ...

感谢您的指引。

其实网上都有解释,indexing有几种,如b-tree,clustered,hash等,但我对理论的理解能力是很差的。所以想法跟正途有偏差,让你以为我找到了新方法。
看了整个方法的过程,也不知道到底在找什么。
所以网上查search engine,都是在提google, 百度等找网页的搜寻器。它们的index table是存放热门关键字。方法是inverted index。
找到B+tree有个字典的小例子。而其他的讲解都是讲磁盘的储存方式,文字数据没有一个例子。
所以我现在又用自己的思维来理解了。我之前说开 A到Z 26个table,这些是index table,data table只有一个。

table name:data, row length:100
------------------------------------------
user_name   email                 password
------------------------------------------
john             tgds@dfd.com     4r3243f
alice             hell@yyy.com     kj43g8fgdfd
william         ww@hh.com        jfdk4878787
mary            hey@hah.com     hh3399j
alibaba         heaven@h.com    thhh2223z

table name:user_a, row length:flex
---------------------
id        user_name
---------------------
1         alice
4         alibaba

table name:user_m, row length:flex
-------------------------
id         user_name  
-------------------------
3          mary

table name:email_h, row length:flex
-------------------------
id         email
-------------------------
1         hell@yyy.com
3         hey@hah.com
4         heaven@h.com


login 可用user name或email。
user:alice
password:kj43g8fgdfd
读取alice的id,然后fseek($res, $id * 100)找password。假设有会员26万,每个user_ table有1万。这样就实现跳帧查找的方法了。
但有个状况。假设所有会员的user name都以a开头,比如阿拉伯人。没有办法让每个index table平均分配。

以上的方法实际吗?会不会有点类似b+tree?





回复

使用道具 举报

发表于 25-1-2017 09:32 AM | 显示全部楼层
小彪 发表于 20-1-2017 06:08 PM
感谢您的指引。

其实网上都有解释,indexing有几种,如b-tree,clustered,hash等,但我对理论的理解能力是很差的。所以想法跟正途有偏差,让你以为我找到了新方法。
看了整个方法的过程,也不知道到底 ...

抱歉,要回家過年了,我大概講一講.再強調一次,我知道的東西可能過時了,也未必真確
所以网上查search engine,都是在提google, 百度等找网页的搜寻器。它们的index table是存放热门关键字。方法是inverted index。

試看database indexing 或 database index
找到B+tree有个字典的小例子。而其他的讲解都是讲磁盘的储存方式,文字数据没有一个例子

不太清楚那是甚麼,但可能是low level計算那一個indexed id在什麼位置.比如文字数据其實沒有row這種東西的,你當他用Carriage Return Line Feed來做delimiter好了.如果不是PHP有著功能,我們就要自己算位置了.比如你說的fseek($res, $id * 100).




读取alice的id,然后fseek($res, $id * 100)找password。假设有会员26万,每个user_ table有1万。这样就实现跳帧查找的方法了。
但有个状况。假设所有会员的user name都以a开头,比如阿拉伯人。没有办法让每个index table平均分配。
再細分下去,你會想到用aa - az的文件來加速,然後再細分.就會有一大堆文件了.很久以前folder只support max 256 files,所以一般他們都會用一個data table + 一個index table.比如dbase,clipper.你也可以看看現有的searching method.你可以當它是array來計算.
  1. 以上的方法实际吗?
复制代码
我覺得行得通(workable),但不肯定是不是實際.
再看看.本來file base database的好處就是在小型database會比較快速,以現在的硬件來說,比如ssd,分別真的是微乎其微了,如果你加了indexing,那就是你需要開2次文件了,一次index,一次data.你提過myd,我想你也可以看看myi.我本身來說,這些知識在工作上幾乎沒什麼機會用到.
很高興你有這興趣.祝順利



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 28-4-2024 02:13 PM , Processed in 0.061532 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表