mysql資料庫對比
Mysql資料庫3種存儲(MyISAM、MEMORY、InnoDB)引擎區別:
1、Myisam是Mysql的默認存儲引擎,當create創建新表時,未指定新表的存儲引擎時,默認使用Myisam。MEMORY、InnoDB不是默認存儲引擎。
2、InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比Myisam的存儲帶消引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留數據和索引。
Mysql資料庫3種存儲(MyISAM、MEMORY、InnoDB)區別對比:
1、MyISAM
它不支持事務,也不支持外鍵,尤其是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT為主的應用基本都可以使用這個引擎來創建表。
數據文件和索引文件可以放置在不同的目錄,平均分配IO,獲取更快的速度。要指定數據文件和索引文件的路徑,需要在創建表的時候通過DATA DIRECTORY和INDEX DIRECTORY語句指定,文件路徑需要使用絕對路徑。
2、MEMORY
memory使用存在內存中的內容來創建表。每個MEMORY表實際對應一個磁碟文件,格式是.frm。MEMORY類型的表訪問非常快,因為它到數據是放在內存中的,並且默認使用HASH索引,但是一旦伺服器關閉,表中的數據就會丟失,但表還會繼續存在。
默認情況下,memory數據表使用散列索引,利用這種索引進行「相等比較」非常快,但是對「范圍比較」的速度就慢多了。因此,散列索引值適合使用在"="和"<=>"的操作符中,不適合使用在"<"或">"操作符中,也同樣不適合用在order by字句里。如果確實要使用"<"或">"或betwen操作符,可以使用btree索引來加快速度。
存儲在MEMORY數據表裡的數據行使用的是長度不變的格式,因此加快處理速度,這意味著不能使用BLOB和TEXT這樣的長度可變的數據類型。VARCHAR是一種長度可變的類型,但因為它在MySQL內部當作長度固定不變的CHAR類型,所以可以使用。
3、InnoDB
InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM的存儲引擎,InnoDB寫的處理效率差一些並且會占核行晌用更多的磁碟空間以保留數據和索引。
(1)自動增長列:
InnoDB表的自動增長列可以手工插入,但是插入的如果是空或0,則實際插入到則是自動增長後到值。可以通過"ALTER TABLE...AUTO_INCREMENT=n;"語句強制設置自動增長值的起始值,默認為1,但是該強制到默認值是保存在內存中,資料庫重啟後該值將會丟失。
可以使用LAST_INSERT_ID()查詢當前線程最後插入記錄使用的值。如果一次插入多條記錄,那麼返回的是第一條記錄使用的自動增長值。對於InnoDB表,自動增長列必須是索引。如果是組合索引,也必須是組合索引的第一列,但是對於MyISAM表,自動增長列可以是組合索引的其他列,這樣插入改鋒記錄後,自動增長列是按照組合索引到前面幾列排序後遞增的。
(2)外鍵約束:
MySQL支持外鍵的存儲引擎只有InnoDB,在創建外鍵的時候,父表必須有對應的索引,子表在創建外鍵的時候也會自動創建對應的索引。
⑵ 如何比較2個mysql資料庫數據
如何納源比較洞兄態塵首2個mysql資料庫數據
sql語句:因為MySQL 沒有full outer join,所以用left join union all right join來實現
select a.table_schema,
a.table_name,
a.column_name,
b.table_schema,
b.table_name,
b.column_name
from information_schema.columns a
left join information_schema.columns b on a.table_name = b.table_name and a.column_name =
b.column_name and b.table_schema = 'DBNAMe1'
where a.table_schema = 'DBNAME2' and
(b.table_name is null or
b.column_name is null)
union all
select a.table_schema,
a.table_name,
a.column_name,
b.table_schema,
b.table_name,
b.column_name
from information_schema.columns a
left join information_schema.columns b on a.table_name = b.table_name and a.column_name =
b.column_name and b.table_schema = 'DBNAME2'
where a.table_schema = 'DBNAME1' and
(b.table_name is null or
b.column_name is NULL) ;
⑶ 如何比較mysql資料庫的表結構和表內容的差異
通過 INFORMATION_SCHEMA TABLES , INFORMATION_SCHEMA COLUMNS 你可以得到所有表的欄位名,然後可以進行分析比較。
⑷ 如何比較mysql資料庫的表結構和表內容的差異
先把每個庫的表結構導出到文件,然後比較這兩個文件。
mysqlmp --skip-comments --skip-extended-insert -u root -p database1>file1.sql
mysqlmp --skip-comments --skip-extended-insert -u root -p database2>file2.sql
diff file1.sql file2.sql
其實還有一些比較工具,推薦一個
mysql-comparison-tools
⑸ 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和HAVING mSQL根本不支持GROUP BY MySQL支持一個有兩個HAVING和下列函數 COUNT() AVG() MIN() MAX() SUM()和STD()的完整的GROUP BY 如果SELECT從一張表中檢索 沒有其他列被檢索並且沒有WHERE子句 COUNT(*)被優化以很快地返回 MIN()和MAX()可以取字元串參數 帶計算的INSERT和UPDATE MySQL能在一個INSERT或UPDATE中做計算 例如 mysql> UPDATE SET x=x* +y WHERE x< ;別名 MySQL有列的別名 限制列名 在MySQL中 如果一個列名在用於查詢的表之間唯一的 你不必須使用完整的 合格者 帶函數的SELECT MySQL有很多函數(太多不能在這里列出 見 用在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驅動程序 z 驅動程序 由Terrence W Zellers 開發的一個type JDBC驅動程序並用於學習目的 mm 驅動程序 由Mark Matthews 開發的一個type JDBC驅動程序 推薦的驅動程序是z或mm驅動程序 兩者均被報導工作出色 我們知道mSQL有一個 JDBC 驅動程序 但是我們對它有太少的經驗不能進行比較 開發速度 MySQL有一個非常小的開發者隊伍 但是我們是非常習慣於用C和C++編碼 非常快速 因為線程 函數 GROUP BY等在mSQL中仍未實現 它有很多追趕工作要做 要想得到關於它的一些前景 你可以查看mSQL最後一年的 HISTIRY 文件 並將它與MySQL參考書手冊的新功能小節比較(見D MySQL變遷歷史) 哪個快開發得最快應該是相當明顯的 實用程序 mSQL和MySQL都有許多有趣的第三方工具 因為向上移植(從mSQL到MySQL)是很容易的 幾乎所有mSQL可用的有趣的應用程序也可被MySQL使用 MySQL帶有一個簡單的msql mysql程序修正在mSQL和MySQL使用的大多數C API函數之間拼寫差別 例如 它將msqlConnect()實例改變為mysql_connect() 變換一個客戶程序從mSQL到MySQL通常花幾分鍾時間 怎樣將mSQL的工具轉換到MySQL根據我們的經驗 轉換諸如使用mSQL C API的msql tcl和msqljava工具將只花不大一小時時間 使得他們用MySQL C API工作 轉換過程是 在源代碼上運行外殼腳本msql mysql 這需要replace程序 它與MySQL一起散發 編譯 修正所有編譯器錯誤 mSQL C API與MySQL C API 之間差別是 MySQL使用一個MYSQL結構作為一種連接類型(mSQL使用一個int) mysql_connect()取一個指向一個MYSQL結構的指針作為一個參數 很容易定義全局性定義一個或使用malloc()獲得一個 mysql_connect()也取兩個參數指定用戶和口令 你可以為了預設使用將這些設置為NULL NULL 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可運用 INTINT 有很多的選項!REALREAL 或FLOAT 有 和 位元組版本 UINTINT UNSIGNEDDATEDATE 使用 ANSI SQL 格式而非mSQL自己的 TIMETIMEMONEYDECIMAL( ) 有 個小數位的定點值 索引創建 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順 lishixin/Article/program/MySQL/201311/29345