Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2566883
  • 博文数量: 709
  • 博客积分: 12251
  • 博客等级: 上将
  • 技术积分: 7905
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-17 00:00
个人简介

实现有价值的IT服务

文章存档

2012年(7)

2011年(147)

2009年(3)

2008年(5)

2007年(74)

2006年(431)

2005年(42)

分类: Mysql/postgreSQL

2006-06-29 14:34:54

MySQL服務器功能

mysqld可以用下列語言發出錯誤消息:捷克語、荷蘭語、英語(缺省)、愛沙尼亞語、法語、德語、匈牙利、意大利語、挪威語。

啟動mysqld使用一種特定的語言,使用一個--language=lang-L lang選項。例如:

shell> mysqld --language=swedish

或:

shell> mysqld --language=/usr/local/share/swedish

注意,所有語言的名稱用小寫字母指定。

語言文件位于(缺省的)'mysql_base_dir/share/LANGUAGE/'

為了更新錯誤消息文件,你應該編輯“errmsg.txt”文件並且執行下列命令生成“errmsg.sys”文件:

shell> comp_err errmsg.txt errmsg.sys

如果你升級到一個更新的MySQL版本,記得要再次用新的“errmsg.txt”文件進行更新。

缺省地,MySQL使用 ISO-8859-1 ( Latin1 ) 字符集。這是在美國和西歐使用的字符集。

字符集決定了在名字中允許什麼字符和如何由SELECT語句的ORDER BYGROUP BY子句排序。

通過給configure--with-charset=charset選項,你可以在編譯時改變字符集。見。

為了把其他字符集加入MySQL,使用下列過程:

  1. 為字符集選擇一個名字,下面用MYSET表示。
  2. MySQL源代碼分發中創造文件“strings/ctype-MYSET.c”
  3. 研究一個現有的“ctype-*.c'文件,看需要定義什麼。注意,你文件中的數組必須有類似于ctype_MYSETto_lower_MYSET等等的名字。to_lower[]to_upper[]是簡單的數組,保存字符集每個成員相應的小寫和大寫字符。例如:
    to_lower['A'] should contain 'a'
    to_upper['a'] should contain 'A'

    sort_order[]是一個映射,指出字符為了比較和排序目的應該如何定序。對于許多字符集,這與to_upper[]一樣(意味著排序將忽略大小寫)。MySQL將基于sort_order[character]值排序字符。ctype[]是一個位值的數組,一個元素對應一個字符。(注意,to_lower[]to_upper[]sort_order[]按字符定下標,但是ctype[]按字符值+1定下標。這是一個舊遺產以便能處理EOF) 你能在“m_ctype.h”找到下列bitmask定義:

    #define _U      01      /* Upper case */
    #define _L      02      /* Lower case */
    #define _N      04      /* Numeral (digit) */
    #define _S      010     /* Spacing character */
    #define _P      020     /* Punctuation */
    #define _C      040     /* Control character */
    #define _B      0100    /* Blank */
    #define _X      0200    /* heXadecimal digit */
    

    每個字符的ctype[]的入口應該是描述字符的適用的位模(bitmask)值的聯合(union)。例如,'A'是一個大寫字符(_U) ,同時是十六進制位(_X),這樣ctype['A'+1]應該包含值:

    _U + _X = 01 + 0200 = 0201
    
  4. 為你的字符集增加一個唯一的編號到“include/m_ctype.h.in”
  5. 把字符集名字加到在configure.in中的CHARSETS_AVAILABLE表。
  6. 重新配置,重新編譯並且測試。

如果你正在創建一個多字節字符集,你可以使用_MB宏。在“include/m_ctype.h.in”,增加:

#define MY_CHARSET_MYSET  X
#if MY_CHARSET_CURRENT == MY_CHARSET_MYSET
#define USE_MB
#define USE_MB_IDENT
#define ismbchar(p, end)  (...)
#define ismbhead(c)       (...)
#define mbcharlen(c)      (...)
#define MBMAXLEN          N
#endif

這里:

MY_CHARSET_MYSET 一個唯一的字符集值。
USE_MB 這個字符集有多字節字符,由ismbhead()mbcharlen()來處理。
USE_MB_IDENT (可選 ) 如果定義,你能使用多字節字符的表和列名。
ismbchar(p, e) 如果p不是一個多字節字符字符串,返回0,否則如果它是,返回字符的大小(字節數)。pe指向字符串的開始和結束。檢查是從(char*)p(char*)e-1
ismbhead(c) 如果c是一個多字節字符字符串的第一個字符,返回真。
mbcharlen(c) 如果c是一個多字節字符串的第一個字符,返回該字符串的大小。
MBMAXLEN 在字符集中最大字符的字節大小。

當以--log-update=file_name選項啟動時,mysqld將所有更新數據的SQL命令寫入記錄文件中。文件被寫入數據目錄並且有一個名字file_name.#,這里#是一個數字,它在每次執行mysqladmin refreshmysqladmin flush-logsFLUSH LOGS語句、或重啟服務器時加1。

如果你使用--log-l選項,mysqld用一個文件名“hostname.log”寫一個通用的記錄文件,並且重啟和更新不會引起一個新的記錄文件生成(盡管它被關閉並且再打開)。缺省地,mysql.server腳本用-l選項啟動MySQL服務器,如果當你在生產環境中開始使用MySQL時,你需要好一些的性能,你可以從mysql.server中刪除-l選項。

更新記錄很聰明,因為它僅僅記載真正更新數據的語句。因此一個用WHEREUPDATEDELETE找不到行,它就不被寫入記錄文件。它甚至跳過將設置一個列為它已經有的值的UPDATE語句。

如果你想要從更新記錄文件更新一個數據庫,你可以如下做到(假設你的更新記錄有“file_name.#”形式的名字):

shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql

ls被用來以正確的次序得到所有的記錄文件。

如果你必須在一個崩潰後恢複到備份文件並且你想要再做發生在備份和崩潰之間的更新,這可以很有用。

當你在其他主機上有一個鏡像數據庫並且你想要複制必須對主數據庫進行的改變時,你也可以使用更新記錄。

MySQL 3.22 在表大小上有一個4G的限制。使用在MySQL 3.23中的新MyISAM 最大的表大小可達8百萬 TB(2^63個字節)。

然而注意,操作系統有其自身文件大小的限制。在Linux上,當前的限制是2G;在Solaris 2.5.1上,限制是4G;在Solaris 2.6上,限制是1000G。這意味著MySQL表的大小通常由操作系統限制。

缺省地,MySQL表最大尺寸大約4G。你可用SHOW TABLE STATUS命令或myisamchk -dv table_name檢查一個表的最大表大小。見。

如果你需要大于 4G 的表(並且你的操作系統支持它),你應該在你創建表時設定AVG_ROW_LENGTHMAX_ROWS參數。見。你也能用ALTER TABLE在以後設置這些。見。

如果你的大表要變成只讀,你可以使用myisampack合並並且把許多表壓縮成一個。myisampack通常壓縮一個表到至少50%,因此你可以有,實際上,更大的表。見。

另一個的解決方案可以是內含包括MERGE庫,它允許你將一個許多相同的表的集合作為一個來處理。(在這種情況下相同意味著所有的表由相同的列信息創建)目前MERGE只能用于掃描一個表集合,因為它不支持索引。我們在不久的將來將把索引加進去。

用MySQL,目前(版本 3.23.6)你可以在三種基本數據庫表格式間選擇。當你創建一張表時,你可以告訴MySQL它應該對于表使用哪個表類型。MySQL將總是創建一個.frm文件保存表和列定義。視表類型而定,索引和數據將在其他文件中存儲。

你能用ALTER TABLE語句在不同類型的表之間變換。見。

MyISAM
MySQL 3.23中,MyISAM是缺省表格類型,它是基于ISAM代碼並且有很多有用的擴展。索引存儲在一個有.MYI(MYindex)擴展名的文件並且數據存儲在有.MYD(MYData)擴展名的文件中。你能用myisamchk實用程序檢查/修複MyISAM表。見。下列幾點在MyISAM中是全新的:
  • 不用刪除行,可以在表中INSERT一個新行,在其他線程從表中正在讀取的同時。
  • 在支持大文件的文件系統/操作系統上支持大文件(63位)。
  • 所有的數據首先存儲低字節,這使數據獨立于機器和OS,唯一的要求是機器使用補2有符號整數(就像最近20年時間內的每台機器)和IEEE浮點格式(也在主流機器上完全主導地位)。不能支持二進制兼容性的機器的唯一領域是嵌入式系統(因為他們有時有古怪的處理器)。
  • 所有的數字鍵先存儲高字節以獲得更高的索引壓縮。
  • AUTO_INCREMENT列的內部處理。MyISAM將自動地在INSERT/UPDATE時更新它。 AUTO_INCREMENT值可以用myisamchk重新設置,這將使得AUTO_INCREMENT列更快速並且原來的數將不象老的ISAM那樣被重新使用。注意,當一個AUTO_INCREMENT定義在一個多部鍵值(multi-part-key)的結尾時,老式的行為仍然是存在。
  • BLOBTEXT列可以被索引。
  • 被索引的列允許NULL值。每個鍵占0-1個字節。
  • 現在最大的鍵長度缺省是500個字節。在鍵大于250個字節的情況下,一個大于缺省的1024個字節的關鍵字塊大小被用于此鍵。
  • 每個表的鍵的最大數目放大到32作為缺省。這不必重新編譯myisamchk就可以放大到64。
  • 在有一個標志MyISAM顯示桌子是否正確被關上的文件。這將不久被用于自動的修理在MySQL服務器。
  • 現在myisamchk將標記表為“檢查的”。myisamchk --fast將僅僅檢查那些沒有這個標記的表。
  • myisamchk -a存儲鍵值組成部分的統計(不只是像ISAM對整個鍵)。
  • 現在在刪除與更新和插入混用時,動態尺寸的行將有更少碎片,這通過自動合並相鄰的刪除塊並且如果下一塊被刪除,通過擴大塊來做到。
  • myisampack能緊縮BLOBVARCHAR列。

MyISAM也支持下列東西,MySQL在不久的將來將能使用。

  • 支持一個真正的VARCHAR類型;一個VARCHAR列以2各字節存儲的長度開始。
  • VARCHAR的表可以式固定或動態的記錄長度。
  • VARCHARCHAR可以最大64K字節。所有的關鍵字片斷有其自身的語言定義,這將使得MySQL每列有不同的語言定義。
  • 一個雜湊計算的索引可用于UNIQUE;這將允許你在一個表中的任何列組合上有UNIQUE屬性。(然而,你不能搜索一個UNIQUE計算的索引。)

你也可以使用放棄的ISAM桌子類型。這將在不久消失,因為MyISAM是同一個東西的更好實現。ISAM使用一個B-tree索引,這個索引存儲在一個有.ISM擴展名的文件中並且數據存儲在有.ISD擴展名的文件中,你可用isamchk實用程序檢查/修複ISAM表。見。ISAM表不是跨OS/平台二進制可移植的。ISAM有下列特征/屬性:

  • 壓縮的且定長鍵
  • 固定和動態記錄長度
  • 有16個鍵,每個鍵有16鍵組成部分
  • 最大鍵長度256(缺省)
  • 數據以機器格式存儲;快速但是依賴于機器/OS 。
HEAP 
HEAP表格使用一個雜湊(hashed)索引並且存儲在內存中。這使他們更快,但是如果MySQL崩潰,你將失去所有存儲的數據。HEAP作為臨時表很可用!
CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
        FROM log_table GROUP BY ip;
SELECT COUNT(ip),AVG(down) FROM test;
DROP TABLE test;

當你使用HEAP表時,這里是你應該考慮的一些事情:

  • 你應該總是在CREATE語句中指定MAX_ROWS以保証你有意不使用所有的內存。
  • 索引將只能與與=<=>一起使用(但是很快)。
  • HEAP表使用一個固定的記錄長度格式。
  • HEAP不支持BLOB/TEXT列。
  • HEAP不支持AUTO_INCREMENT列。
  • HEAP不支持在一個NULL列上的索引。
  • 你可以在一個HEAP表中有非唯一鍵(雜湊表一般不這樣)。
  • HEAP表格在所有的客戶之間被共享(就象任何其他的表)。
  • HEAP表的數據以小塊分配。表是100%動態的(在插入時),無需溢出區和額外的鍵空間。刪除的行放入一個鏈接表並且當你把新數據插入到表時,它將被再次使用。
  • 為了釋放內存,你應該執行DELETE FROM heap_tableDROP TABLE heap_table
  • 為了保証你不會偶然做些愚蠢的事情,你不能創建比max_heap_table_size大的HEAP表。
阅读(1175) | 评论(0) | 转发(0) |
0

上一篇:MySQL教程

下一篇:從MySQL得到最大的性能

给主人留下些什么吧!~~