?? manual_server.html
字號:
</tr>
<tr>
<td><code>mbcharlen(c)</code> </td>
<td>如果<code>c</code>是一個多字節字符串的第一個字符,返回該字符串的大小。</td>
</tr>
<tr>
<td><code>MBMAXLEN</code> </td>
<td>在字符集中最大字符的字節大小。</td>
</tr>
</table>
<h2><a NAME="Update_log" HREF="manual_toc.html#Update_log">9.2 更新日志</a></h2>
<p>當以<code>--log-update=file_name</code>選項啟動時,<code>mysqld</code>將所有更新數據的SQL命令寫入記錄文件中。文件被寫入數據目錄并且有一個名字<code>file_name.#</code>,這里<code>#</code>是一個數字,它在每次執行<code>mysqladmin
refresh</code>或<code>mysqladmin flush-logs</code>、<code>FLUSH LOGS</code>語句、或重啟服務器時加1。
</p>
<p>如果你使用<code>--log</code>或<code>-l</code>選項,<code>mysqld</code>用一個文件名<tt>“hostname.log”</tt>寫一個通用的記錄文件,并且重啟和更新不會引起一個新的記錄文件生成(盡管它被關閉并且再打開)。缺省地,<code>mysql.server</code>腳本用<code>-l</code>選項啟動<strong>MySQL</strong>服務器,如果當你在生產環境中開始使用<strong>MySQL</strong>時,你需要好一些的性能,你可以從<code>mysql.server</code>中刪除<code>-l</code>選項。
</p>
<p>更新記錄很聰明,因為它僅僅記載真正更新數據的語句。因此一個用<code>WHERE</code>的<code>UPDATE</code>或<code>DELETE</code>找不到行,它就不被寫入記錄文件。它甚至跳過將設置一個列為它已經有的值<code>的UPDATE</code>語句。
</p>
<p>如果你想要從更新記錄文件更新一個數據庫,你可以如下做到(假設你的更新記錄有<tt>“file_name.#”</tt>形式的名字):
</p>
<pre>shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql
</pre>
<p><code>ls</code>被用來以正確的次序得到所有的記錄文件。 </p>
<p>如果你必須在一個崩潰后恢復到備份文件并且你想要再做發生在備份和崩潰之間的更新,這可以很有用。
</p>
<p><a NAME="IDX608"></a>當你在其他主機上有一個鏡像數據庫并且你想要復制必須對主數據庫進行的改變時,你也可以使用更新記錄。
</p>
<h2><a NAME="Table_size" HREF="manual_toc.html#Table_size">9.3 MySQL數據庫表可以有多大?</a></h2>
<p><strong>MySQL</strong> 3.22 在表大小上有一個4G的限制。使用在<strong>MySQL</strong>
3.23中的新MyISAM 最大的表大小可達8百萬 TB(2^63個字節)。 </p>
<p>然而注意,操作系統有其自身文件大小的限制。在Linux上,當前的限制是2G;在Solaris
2.5.1上,限制是4G;在Solaris 2.6上,限制是1000G。這意味著<strong>MySQL</strong>表的大小通常由操作系統限制。
</p>
<p>缺省地,<strong>MySQL</strong>表最大尺寸大約4G。你可用<code>SHOW TABLE
STATUS</code>命令或<code>myisamchk -dv table_name</code>檢查一個表的最大表大小。見<a HREF="manual_Reference.html#SHOW">7.21<code> SHOW</code>句法(得到表、列等的信息)</a>。</p>
<p>如果你需要大于 4G 的表(并且你的操作系統支持它),你應該在你創建表時設定<code>AVG_ROW_LENGTH</code>和<code>MAX_ROWS</code>參數。見<a HREF="manual_Reference.html#CREATE_TABLE">7.7<code> CREATE TABLE</code>語法</a>。你也能用<code>ALTER
TABLE</code>在以后設置這些。見<a HREF="manual_Reference.html#ALTER_TABLE">7.8<code>
ALTER TABLE</code>語法</a>。 </p>
<p>如果你的大表要變成只讀,你可以使用<code>myisampack</code>合并并且把許多表壓縮成一個。<code>myisampack</code>通常壓縮一個表到至少50%,因此你可以有,實際上,更大的表。見<a HREF="manual_Tools.html#myisampack">12.5 MySQL壓縮的只讀的表生成器</a>。 </p>
<p>另一個的解決方案可以是內含包括MERGE庫,它允許你將一個許多相同的表的集合作為一個來處理。(在這種情況下相同意味著所有的表由相同的列信息創建)目前MERGE只能用于掃描一個表集合,因為它不支持索引。我們在不久的將來將把索引加進去。
</p>
<h2><a NAME="Table_types" HREF="manual_toc.html#Table_types">9.4 MySQL數據庫表類型</a></h2>
<p>用MySQL,目前(版本 3.23.6)你可以在三種基本數據庫表格式間選擇。當你創建一張表時,你可以告訴<strong>MySQL</strong>它應該對于表使用哪個表類型。<strong>MySQL</strong>將總是創建一個<code>.frm</code>文件保存表和列定義。視表類型而定,索引和數據將在其他文件中存儲。
</p>
<p>你能用<code>ALTER TABLE</code>語句在不同類型的表之間變換。見<a HREF="manual_Reference.html#ALTER_TABLE">7.8<code> ALTER TABLE</code>語法</a>。
<dl COMPACT="manual_Reference.html#ALTER_TABLE">
<dt><strong><code>MyISAM</code></strong></dt>
<dd>在<strong>MySQL</strong> 3.23中,<code>MyISAM</code>是缺省表格類型,它是基于<code>ISAM</code>代碼并且有很多有用的擴展。索引存儲在一個有<code>.MYI</code>(MYindex)擴展名的文件并且數據存儲在有<code>.MYD</code>(MYData)擴展名的文件中。你能用<code>myisamchk</code>實用程序檢查/修復<code>MyISAM</code>表。見<a HREF="manual_Maintenance.html#Crash_recovery">13.4 對崩潰恢復使用<code>myisamchk</code></a>。下列幾點在<code>MyISAM</code>中是全新的:
<ul>
<li type="disc">不用刪除行,可以在表中<code>INSERT</code>一個新行,在其他線程從表中正在讀取的同時。
</li>
<li>在支持大文件的文件系統/操作系統上支持大文件(63位)。</li>
<li>所有的數據首先存儲低字節,這使數據獨立于機器和OS,唯一的要求是機器使用補2有符號整數(就像最近20年時間內的每臺機器)和IEEE浮點格式(也在主流機器上完全主導地位)。不能支持二進制兼容性的機器的唯一領域是嵌入式系統(因為他們有時有古怪的處理器)。
</li>
<li>所有的數字鍵先存儲高字節以獲得更高的索引壓縮。 </li>
<li><code>AUTO_INCREMENT</code>列的內部處理。<code>MyISAM</code>將自動地在<code>INSERT/UPDATE</code>時更新它。
<code>AUTO_INCREMENT</code>值可以用<code>myisamchk</code>重新設置,這將使得<code>AUTO_INCREMENT</code>列更快速并且原來的數將不象老的ISAM那樣被重新使用。注意,當一個<code>AUTO_INCREMENT</code>定義在一個多部鍵值(multi-part-key)的結尾時,老式的行為仍然是存在。
</li>
<li><code>BLOB</code>和<code>TEXT</code>列可以被索引。 </li>
<li>被索引的列允許<code>NULL</code>值。每個鍵占0-1個字節。 </li>
<li>現在最大的鍵長度缺省是500個字節。在鍵大于250個字節的情況下,一個大于缺省的1024個字節的關鍵字塊大小被用于此鍵。
</li>
<li>每個表的鍵的最大數目放大到32作為缺省。這不必重新編譯<code>myisamchk</code>就可以放大到64。
</li>
<li>在有一個標志<code>MyISAM</code>顯示桌子是否正確被關上的文件。這將不久被用于自動的修理在<strong>MySQL</strong>服務器。
</li>
<li>現在<code>myisamchk</code>將標記表為“檢查的”。<code>myisamchk --fast</code>將僅僅檢查那些沒有這個標記的表。
</li>
<li><code>myisamchk -a</code>存儲鍵值組成部分的統計(不只是像<code>ISAM</code>對整個鍵)。
</li>
<li>現在在刪除與更新和插入混用時,動態尺寸的行將有更少碎片,這通過自動合并相鄰的刪除塊并且如果下一塊被刪除,通過擴大塊來做到。
</li>
<li><code>myisampack</code>能緊縮<code>BLOB</code>和<code>VARCHAR</code>列。 </li>
</ul>
<p><code>MyISAM</code>也支持下列東西,<strong>MySQL</strong>在不久的將來將能使用。
<ul>
<li type="disc">支持一個真正的<code>VARCHAR</code>類型;一個<code>VARCHAR</code>列以2各字節存儲的長度開始。
</li>
<li type="disc">用<code>VARCHAR</code>的表可以式固定或動態的記錄長度。 </li>
<li><code>VARCHAR</code>和<code>CHAR</code>可以最大64K字節。所有的關鍵字片斷有其自身的語言定義,這將使得<strong>MySQL</strong>每列有不同的語言定義。
</li>
<li>一個雜湊計算的索引可用于<code>UNIQUE</code>;這將允許你在一個表中的任何列組合上有<code>UNIQUE</code>屬性。(然而,你不能搜索一個<code>UNIQUE</code>計算的索引。)</li>
</ul>
<p>你也可以使用放棄的ISAM桌子類型。這將在不久消失,因為<code>MyISAM</code>是同一個東西的更好實現。ISAM使用一個<code>B-tree</code>索引,這個索引存儲在一個有<code>.ISM</code>擴展名的文件中并且數據存儲在有<code>.ISD</code>擴展名的文件中,你可用<code>isamchk</code>實用程序檢查/修復ISAM表。見<a HREF="manual_Maintenance.html#Crash_recovery">13.4 使用<code>myisamchk</code>恢復崩潰</a>。ISAM表不是跨OS/平臺二進制可移植的。<code>ISAM</code>有下列特征/屬性:
<ul>
<li type="disc">壓縮的且定長鍵</li>
<li>固定和動態記錄長度</li>
<li type="disc">有16個鍵,每個鍵有16鍵組成部分</li>
<li>最大鍵長度256(缺省)</li>
<li>數據以機器格式存儲;快速但是依賴于機器/OS 。 </li>
</ul>
</dd>
<dt><strong><code>HEAP</code> </strong></dt>
<dd><code>HEAP</code>表格使用一個雜湊(hashed)索引并且存儲在內存中。這使他們更快,但是如果<strong>MySQL</strong>崩潰,你將失去所有存儲的數據。<code>HEAP</code>作為臨時表很可用!
<pre>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;
</pre>
<p>當你使用<code>HEAP</code>表時,這里是你應該考慮的一些事情: <ul>
<li type="disc">你應該總是在<code>CREATE</code>語句中指定<code>MAX_ROWS</code>以保證你有意不使用所有的內存。
</li>
<li>索引將只能與與<code>=</code>和<code><=></code>一起使用(但是很快)。
</li>
<li><code>HEAP</code>表使用一個固定的記錄長度格式。 </li>
<li><code>HEAP</code>不支持<code>BLOB</code>/<code>TEXT</code>列。 </li>
<li><code>HEAP</code>不支持<code>AUTO_INCREMENT</code>列。 </li>
<li><code>HEAP</code>不支持在一個<code>NULL</code>列上的索引。 </li>
<li>你可以在一個<code>HEAP</code>表中有非唯一鍵(雜湊表一般不這樣)。 </li>
<li><code>HEAP</code>表格在所有的客戶之間被共享(就象任何其他的表)。 </li>
<li><code>HEAP</code>表的數據以小塊分配。表是100%動態的(在插入時),無需溢出區和額外的鍵空間。刪除的行放入一個鏈接表并且當你把新數據插入到表時,它將被再次使用。
</li>
<li>為了釋放內存,你應該執行<code>DELETE FROM heap_table</code>或<code>DROP
TABLE heap_table</code>。 </li>
<li>為了保證你不會偶然做些愚蠢的事情,你不能創建比<code>max_heap_table_size</code>大的<code>HEAP</code>表。
</li>
</ul>
</dd>
</dl>
<hr>
<p>到<a HREF="manual_Introduction.html">第一章</a>, <a HREF="manual_Tutorial.html">前一章</a>,
<a HREF="manual_Performance.html">下一章</a>, <a HREF="manual_Concept_Index.html">最后一章</a>,<a HREF="manual_toc.html">目錄</a>.</p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -