熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MySQL 文件系統

2022-06-13   來源: MySQL 

  實際上這不是通常意義上的文件系統它沒有磁盤空間而是使用MySQL 守護程序來存儲數據可以把SQL 表和一些函數通過文件系統來實現
  
  怎樣實現?
  讓我們來看使用實例
  
  [root@localhost /root]# mount t corbafs o `cat /tmp/mysqlcorbafsior` none
  /mnt/mysql/
  
  [root@localhost /root]# mount
  /dev/hda on / type ext (rw)
  none on /proc type proc (rw)
  none on /dev/pts type devpts (rwgid=mode=)
  /dev/hda on /mnt/win type vfat (rwmode=)
  /dev/hda on /mnt/linux type vfat (rwnoexecnosuidnodevmode=)
  none on /mnt/mysql type corbafs
  (rwIOR:edbcaffcdae
  aeee
  bcaefaeccf)
  
  [root@localhost /root]# ls la /mnt/mysql/
  
  total
  
  rxrxrx root root dets : uptime
  drxrxrx root root dets : test
  drxrxrx root root dets : mysql
  
  [root@localhost /root]# cat /mnt/mysql/uptime
  
  
  
  [root@localhost /root]# cat /mnt/mysql/mysql/user/Host
  
  cpqspamee
  cpqspamee
  localhost
  localhost
  localhost
  localhost
  localhost
  localhost
  
  [root@localhost /root]# cat /mnt/mysql/mysql/user/Insert_priv
  N
  N
  N
  N
  N
  N
  Y
  Y
  
  [root@localhost /root]# umount /mnt/mysql/
  
  為什麼要這樣做呢?
  在一些情形下這樣做能讓工作更加輕松MySQL 和文件系統都能叫做數據庫但是有著絕然不同的概念和優缺點在文件系統裡對象能很快而且很容易找到即使改變名字也能很快找到每一個初學者大概都應該學會move/copy/rename/delete這樣的操作
  但是SQL 不一樣他通過應用程序來操縱存儲在文件系統上的數據而MySQL 文件系統把SQL 做到了用戶級用戶能用他們知道的方式來操作數據庫
  
  任何一個新產品需要通過網絡存取數據的話必須支持一些協議以及可能的其他辦法通過網絡存取文件系統MySQL 表就可以通過這樣的方式來存取即使MySQL 沒有移植到對應的平台
  
  備份和版本控制普通的文件系統通過任何備份軟件就可以實現數據可以通過diff來比較並且用cvs 來控制版本
  
  更短的編程時間有時候人們需要保存簡單的數據像當前日期或者站點名字這些數據很少改變普通的方法需要使用
  
  連接服務器> 選擇數據庫 > 執行命令> 存儲結果
  
  而使用 MySQL 文件系統後只需要一句話(PHP實現)
  
  include(¨/mountpoint/database/table/field¨);
  
  或者換一種方式表達
  
  include(¨/mnt/mysql/sitedata/topic/todaytopic¨);
  
  這樣就很容易理解也占用了較少的空間還可以通過SAMBA 來共享 /mnt/mysql達到直接修改SQL 數據庫的目的能直接寫文本到數據庫或者使用拷貝/粘貼功能把圖片放入數據庫這要比用Perl 或者PHP 寫幾百行程序省力多了
  
  性能如何?
  在發表這篇文章的時候這個文件系統還處於原型開發階段因此速度還不是很理想
  如果到了正式發布的時候一些數據庫功能會比使用 SQL 要快 當然很多還是沒法和SQL 相比無論是性能上還是功能上很多復雜的查詢依然需要通過SQL 語句來完成但是這樣節省了很多開發和培訓的時間所以在效率上來說也是一種節省
  
  支持的表類型
  目前這個文件系統支持所有的表類型MyISAMDBDHEAPISAM
  
  其他的特色
  在第一步開發中實現的還只是只讀很快會有能讀寫的版本出來目前的計劃是把數據庫對象映射成文件和目錄對象讓我們來看看例子
  
  <
  #建立表
  
  CREATE TABLE invoice (
  invoice_id int() unsigned NOT NULL auto_increment
  invoice_no int() unsigned DEFAULT NOT NULL
  payee char() DEFAULT NOT NULL
  PRIMARY KEY (invoice_id)
  KEY payee (payee)
  );
  
  # 插入數據
  
  INSERT INTO invoice VALUES (Company AB);
  INSERT INTO invoice VALUES (Company CD);
  INSERT INTO invoice VALUES (Company EF);
  
  <
  
  因為 MySQL 沒有辦法使用記錄號所以我們必須建立主鍵
  就有了以下的目錄結構
  
  /mountpoint/database/table/primary_key/field
  
  這樣每個列出現在不同的文件行之中文件樹的結構如下
  
  /mnt/mysql/mydata/invoice//invoice_id
  /mnt/mysql/mydata/invoice//invoice_no
  /mnt/mysql/mydata/invoice//payee
  /mnt/mysql/mydata/invoice//invoice_id
  /mnt/mysql/mydata/invoice//invoice_no
  /mnt/mysql/mydata/invoice//payee
  /mnt/mysql/mydata/invoice//invoice_id
  /mnt/mysql/mydata/invoice//invoice_no
  /mnt/mysql/mydata/invoice//payee
  
  另外還有第二個辦法可以使用
  
  /mountpoint/database/table/table
  和
  /mountpoint/database/table/primary_key/record
  /mnt/mysql/mydata/invoice/table
  /mnt/mysql/mydata/invoice//record
  /mnt/mysql/mydata/invoice//invoice_id
  /mnt/mysql/mydata/invoice//invoice_no
  /mnt/mysql/mydata/invoice//payee
  /mnt/mysql/mydata/invoice//record
  /mnt/mysql/mydata/invoice//invoice_id
  /mnt/mysql/mydata/invoice//invoice_no
  /mnt/mysql/mydata/invoice//payee
  /mnt/mysql/mydata/invoice//record
  /mnt/mysql/mydata/invoice//invoice_id
  /mnt/mysql/mydata/invoice//invoice_no
  /mnt/mysql/mydata/invoice//payee
  
  這些文件是隱含的以防重復主要用來方便地通過文本文件浏覽器來查看
  
  現在在那些需要使用SQL 語句搜索最小最大最後等數據可以通過符號連接來實現了
  
  /mountpoint/database/table/primary_key/max
  或者
  /mnt/mysql/mydata/invoice/invoice_id/max
  或者指向
  /mountpoint/database/table/field
  和
  /mnt/mysql/mydata/invoice/
  
  同樣的就可以返回一行的 min/max/sum/avg 等數值
  這能很快並且很容易地實現
  
  /mnt/mysql/mydata/keys/
  /mnt/mysql/mydata/keys/invoice_id/
  /mnt/mysql/mydata/keys/payee/
  
  符號連接到主鍵
  /mnt/mysql/mydata/keys/primary_key/ 
  實際上指向
  /mnt/mysql/mydata/keys/invoice_id/
  
  還有一些隱藏文件提供鍵類型
  /mnt/mysql/mydata/keys/invoice_id/type
  /mnt/mysql/mydata/keys/payee/type
  
  第一個文內容為¨PRIMARY KEY¨ 第二個為 ¨KEY¨
  
  另外還可以用索引來排序記錄如果讀取下面的目錄
  
  /mnt/mysql/mydata/keys/payee/asc/
  
  PHP 的readdir() 函數就以升序返回數據的符號連接
  
  另外還有一些全局函數
  
  /mountpoint/version
  /mountpoint/last_insert_id
  /mountpoint/uptime
  /mountpoint/database/raid (/)
  /mountpoint/database/type (ISAM/MyISAM/HEAP/DBD)
  /mountpoint/database/tables
  /mountpoint/database/table/created
  /mountpoint/database/table/last_updated
  /mountpoint/database/table/last_checked
  /mountpoint/database/unt
  
  寫權限?
  在開發的第二階段會有措施執行SQL 語句現在的思路是
  
  采用目錄
  /mountpoint/mand/
  
  然後執行命令把SQL 語句作為目錄建立
  或者建立目錄把SQL 語句作為文件放入這個目錄
  
  兩個方案都有優點第一個方案可以重新使用SQL 語句但是這樣的目錄名實在不敢令人苟同第二個方案采用信號量文件語句執行完畢就刪除這個文件沒有任務使用時目錄也被刪除對於那些慢速的查詢響應可以選擇timeout 的時間
  
  權限管理
  在權限管理方面可以使用Unix 的權限管理方式這樣的方案看來是最好的
From:http://tw.wingwit.com/Article/program/MySQL/201311/29464.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.