查看: 914|回复: 11
|
用PHP自编数据库
[复制链接]
|
|
本帖最后由 小彪 于 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一样快?
|
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
发表于 9-1-2017 06:23 PM
|
显示全部楼层
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功能。对吗?
|
|
|
|
|
|
|
|
发表于 14-1-2017 02:07 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 14-1-2017 02:18 PM
来自手机
|
显示全部楼层
xml有沒有可能?
|
|
|
|
|
|
|
|
楼主 |
发表于 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 编辑
感谢您的指引。
其实网上都有解释,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來計算.
我覺得行得通(workable),但不肯定是不是實際.
再看看.本來file base database的好處就是在小型database會比較快速,以現在的硬件來說,比如ssd,分別真的是微乎其微了,如果你加了indexing,那就是你需要開2次文件了,一次index,一次data.你提過myd,我想你也可以看看myi.我本身來說,這些知識在工作上幾乎沒什麼機會用到.
很高興你有這興趣.祝順利
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|