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

MySQL高級特性----對比與其他數據庫

2022-06-13   來源: MySQL 

  性能
  對於速度的真實比較請教不斷成熟的MySQL基准套件 使用你自己的基准因為沒有線程創建開銷一個較小的語法分析器較少功能和簡單的安全性mSQL應該在下列方面更快些
  執行重復的連接和斷開的測試在每個連接期間運行一個非常簡單的查詢
  有很少的列和鍵的插入很簡單的表的INSERT操作
  CREATE TABLE和DROP TABLE
  在不是一個索引的一些東西上SELECT(一個表掃描是很容易的
  因為這些操作是如此簡單當你有更高的啟動開銷時很難在這些方面變得更好在連接被建立以後MySQL應該性能好一些在另一方面MySQL比mSQL(以及大多數其他的SQL實現)在下列方面更好些
  
  復雜的SELECT操作
  檢索較大的結果(MySQL有一個更好更快並且更安全的協議)
  有變長字符串的表因為MySQL有更有效的並可在VARCHAR列上索引
  有很多列的表的處理
  由長記錄的表的處理
  有很多許多表達式的SELECT
  在大表上的SELECT
  同時處理很多連接MySQL充分是完全多線程化的每個連接有它自己的線程這意味著沒有線程必須等待另一個線程(除非一個線程正在修改一張表另外的線程想要存取)在mSQL中一旦一個連接被建立了所有其它線程必須等到第一個線程完成不管連接正在運行的查詢是短的或是長的當第一個連接終止時下一個才能工作而此時所有其它線程再次等待等等
  
  聯結如果你改變一個SELECT中的表的順序mSQL可能變得異常地慢在基准套件中比MySQL要慢超過倍的時間這是由於mSQL缺乏一個聯結優化器以便以最佳的順序排定表然而如果你把表按完全正確的順序放在mSQL中並且WHERE是很簡單的並使用索引列聯結將相對快些!見 使用你自己的基准
  ORDER BY和GROUP BY
  DISTINCT
  使用TEXT或BLOB列
  
  SQL功能
  GROUP BY和HAVINGmSQL根本不支持GROUP BYMySQL支持一個有兩個HAVING和下列函數 COUNT()AVG()MIN()MAX()SUM()和STD()的完整的GROUP BY如果SELECT從一張表中檢索沒有其他列被檢索並且沒有WHERE子句COUNT(*)被優化以很快地返回 MIN()和MAX()可以取字符串參數
  帶計算的INSERT和UPDATEMySQL能在一個INSERT或UPDATE中做計算例如
  mysql> UPDATE SET x=x*+y WHERE x<;
  
  別名MySQL有列的別名
  限制列名在MySQL中如果一個列名在用於查詢的表之間唯一的你不必須使用完整的 合格者
  帶函數的SELECTMySQL有很多函數(太多不能在這裡列出 用在SELECT和WHERE子句中的函數)
  
  磁盤空間效率
  即你能使你的表有多小?MySQL有很精確的類型因此你可以創建占據很小空間的表一個有用的MySQL數據類型的例子是MEDIUMINT它是個字節長如果你有個記錄每個記錄節省甚至一個字節也是很重要的mSQL有一個較有限的列類型集合因此更難於使表更小
  
  穩定性
  這較難客觀地評價對於MySQL穩定性的討論 MySQL有多麼穩定?我們沒有mSQL穩定性的經驗因此我們對此不能說任何東西
  價格
  另一個重要的問題是許可證MySQL有一個比mSQL更靈活的許可證並且也不比mSQL昂貴無論你選擇使用哪個產品記得要至少考慮支付一個許可證或電子郵件支持的費用(當然如果你把你出售的一個產品包括在MySQL中你將被要求獲得一個許可證
  
  Perl接口
  MySQL有與mSQL基本相同Perl接口當有一些增加的功能
  
  JDBC ( Java )
  MySQL目前有個JDBC驅動程序
  gwe 驅動程序由GWE technologies 開發的一個Java接口(不再支持)
  jms 驅動程序由Xiaokun Kelvin ZHU的開發的一個改進的gwe驅動程序
  twz 驅動程序由Terrence W Zellers 開發的一個type JDBC驅動程序並用於學習目的
  mm 驅動程序由Mark Matthews 開發的一個type JDBC驅動程序
  推薦的驅動程序是twz或mm驅動程序兩者均被報導工作出色我們知道mSQL有一個 JDBC 驅動程序但是我們對它有太少的經驗不能進行比較
  
  開發速度
  MySQL有一個非常小的開發者隊伍但是我們是非常習慣於用C和C++編碼非常快速因為線程函數GROUP BY等在mSQL中仍未實現它有很多追趕工作要做要想得到關於它的一些前景你可以查看mSQL最後一年的 HISTIRY文件並將它與MySQL參考書手冊的新功能小節比較(見D MySQL變遷歷史)哪個快開發得最快應該是相當明顯的
  
  實用程序
  mSQL和MySQL都有許多有趣的第三方工具因為向上移植(從mSQL到MySQL)是很容易的幾乎所有mSQL可用的有趣的應用程序也可被MySQL使用MySQL帶有一個簡單的msqlmysql程序修正在mSQL和MySQL使用的大多數C API函數之間拼寫差別例如它將msqlConnect()實例改變為mysql_connect()變換一個客戶程序從mSQL到MySQL通常花幾分鐘時間
   怎樣將mSQL的工具轉換到MySQL
  根據我們的經驗轉換諸如使用mSQL C API的msqltcl和msqljava工具將只花不大一小時時間使得他們用MySQL C API工作
  
  轉換過程是
  在源代碼上運行外殼腳本msqlmysql這需要replace程序它與MySQL一起散發
  編譯
  修正所有編譯器錯誤
  mSQL C API與MySQL C API 之間差別是
  
  MySQL使用一個MYSQL結構作為一種連接類型(mSQL使用一個int)
  mysql_connect()取一個指向一個MYSQL結構的指針作為一個參數很容易定義全局性定義一個或使用malloc()獲得一個mysql_connect()也取兩個參數指定用戶和口令你可以為了缺省使用將這些設置為NULLNULL
  mysql_error()取MYSQL結構作為一個參數如果你正在移植老的代碼只是把參數加到你的老的msql_error()編碼中
  MySQL對所有錯誤返回一個錯誤號和一條文本錯誤消息mSQL僅返回一條文字錯誤消息
  存在某些不兼容性因為MySQL支持從同一個進程的到服務器多個連接
  
   mSQL和MySQL的客戶機/服務器通訊協議有何不同
  有足夠的差別使得不可能(或至少不容易)支持兩者
  
  它MySQL協議不同於mSQL協議的最重要的方面列在下面
  
  一個消息緩沖區可以包含很多結果行
  如果查詢或結果比當前緩沖區大消息緩沖區動態地被擴大直到一個可配置的服務器和客戶上限
  所有的包被編號以捕捉重復或丟失的包
  所有的列值以ASCII碼發送列和行的長度以緊湊的二進制編碼(個字節)發送
  MySQL能在未緩沖得結果中讀取(不必在客戶端存儲完整的集合)
  如果一個單獨寫/讀花了超過秒時間服務器關閉連接
  如果一個連接空閒個小時服務器關閉連接
   mSQL 的SQL句法與MySQL有何不同
  列類型
  
  MySQL
  有下列額外的類型(比較其他的 CREATE TABLE句法)
  對於一個字符串集中之一的ENUM類型
  對於一個字符串集中多個的SET類型
  對於位整數的BIGINT類型
  MySQL也支持下列額外的類型屬性
  UNSIGNED選項
  對於整數列的ZEROFILL選項
  對於是一個PRIMARY KEY的整數列的AUTO_INCREMENT選項 mysql_insert_id()
  對所有列的DEFAULT值
  
  mSQL
  mSQL列類型對應於MySQL類型顯示在下面mSQL類型 相應的MySQL類型 
  CHAR(len) CHAR(len) 
  TEXT(len) TEXT(len)len是最大長度並且LIKE可運用
  INT INT有很多的選項! 
  REAL REAL或FLOAT字節版本
  UINT INT UNSIGNED 
  DATE DATE使用 ANSI SQL 格式而非mSQL自己的
  TIME TIME 
  MONEY DECIMAL()個小數位的定點值
  
  索引創建
  MySQL
  索引可以在表創建時用CREATE TABLE語句指定
  mSQL
  在表被創建了以後索引必須被創建用單獨的CREATE INDEX語句
  把一個唯一標識符插入到一張表中
  
  MySQL 使用AUTO_INCREMENT作為列類型修飾符 mysql_insert_id()
  mSQL
  在一張表上創建一個SEQUENCE並且選擇_seq列
  為行獲得一個唯一標識符
  
  MySQL 向表中增加一個PRIMARY KEY或UNIQUE鍵
  
  mSQL 使用_rowid列注意_rowid可以將來改變取決於很多因素
  得到列最後被修改的時間
  
  MySQL 在表中增加一個TIMESTAMP列如果你不給出列值或如果你給它一個NULL值該列自動為INSERT或UPDATE語句設置為當前的日期和時間
  
  mSQL 使用_timestamp列
  NULL值的比較
  
  MySQL MySQL遵從ANSI SQL且與NULL的比較總是NULL
  
  mSQL 在mSQL中NULL = NULL是TRUE(真)當從mSQL到MySQL移植老的代碼時你必須將=NULL改委IS NULL並將<>NULL改為IS NOT NULL
  字符串的比較
  
  MySQL
  通常字符串比較以大小寫無關方式按當前字符集(缺省為ISO Latin)決定的排序次序實施如果你不喜歡這樣聲明你的列有BINARY屬性它使得比較根據用在MySQL服務器主機上的ASCII順序進行
  mSQL
  所有的字符串比較以大小寫敏感的方式以ASCII順
From:http://tw.wingwit.com/Article/program/MySQL/201311/29345.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.