📄 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 + -