文章列表
 
您正在查看 "技术文章" 分类下的文章

2009-03-05 19:08
在Windows XP中,如果你尝试通过网络进行来访问远程电脑中共享文件夹的话,那么将会延迟近30秒的时间,这是因为Windows XP需要额外的时间来进行查找远程电脑中所包含的任务。下面的方法可以让你加快速度。打开注册表编辑器,找到  HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/RemoteComputer/NameSpace,找到其分支{D6277990-4C6A-11CF-8D87-00AA0060F5BF},再将其删除。
 
2009-03-04 11:27

      .在查询分析器理启动或停止SQL Agent服务  启动

  use master

  go

  xp_cmdshell 'net start SQLSERVERAGENT'

  停止

  use master

  go

  xp_cmdshell 'net stop SQLSERVERAGENT'

  将服务的启动从手工方式改为自动启动方式

  exec xp_cmdshell 'scm -Action 7 -Service ms[u]sqlserver[/u]:http://www.sqlclub.cn/MSSQL/default.htm-SvcStartType 2'

  直接用命令行执行引号内的内容也可以。

  2、启动不正常原因和处理

  表面上看SQL Server agent 服务启动正常,但在查看作业的属性与作业历史记录时都出现如下错误:

  错误14258:当SQLServerAgent正在启动时,无法执行此操作。请稍后再试。

  可能原因:

  选择了"使用 Windows NT 纤程",具体原因不明。

  解决方法:

  企业管理器--右键SQL实例--属性--处理器--取消选择"使用 Windows NT 纤程"

  然后重新启动sql服务

  修改了系统密码

  解决方法:

  a. 我的电脑--控制面板--管理工具--服务--右键 MS SQLServer--属性--登陆--登陆身份--选择"本地系统帐户"

  或:

  b.我的电脑--控制面板--管理工具--服务--右键 MS SQLServer--属性--登陆--登陆身份--选择"此帐户"--选择 administrator ,密码和确认密码中输入你的administrator密码.

  两者的区别:

  选择第一种方式,以后修改了administrator密码,不用再调整(但要求登陆操作系统的是系统管理员)

  数据库非法DOWN机出现故障

  解决方法:

  用安装光盘重新安装,然后选择‘高级选项’—‘重建注册表’,然后一路下去……

 
2009-03-04 11:26

       ASCII(str)

  返回字符串str的最左面字符的ASCII代码值。假如str是空字符串,返回0。假如str是NULL,返回NULL。

  mysql> select ASCII('2');

  -> 50

  mysql> select ASCII(2);

  -> 50

  mysql> select ASCII('dx');

  -> 100

  也可参见ORD()函数。

  ORD(str)

  假如字符串str最左面字符是个多字节字符,通过以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代码值来返回多字节字符代码。假如最左面的字符不是个多字节字符。返回和ASCII()函数返回的相同值。

  mysql> select ORD('2');

  -> 50

  CONV(N,from_base,to_base)

  在不同的数字基之间变换数字。返回数字N的字符串数字,从from_base基变换为to_base基,假如任何参数是NULL,返回NULL。参数N解释为一个整数,但是能够指定为一个整数或一个字符串。最小基是2且最大的基是36。假如to_base是个负数,N被认为是个有符号数,否则,N被当作无符号数。 CONV以64位点精度工作。

  mysql> select CONV("a",16,2);

  -> '1010'

  mysql> select CONV("6E",18,8);

  -> '172'

  mysql> select CONV(-17,10,-18);

  -> '-H'

  mysql> select CONV(10+"10"+'10'+0xa,10,10);

  -> '40'

  BIN(N)

  返回二进制值N的一个字符串表示,在此N是个长整数(BIGINT)数字,这等价于CONV(N,10,2)。假如N是NULL,返回NULL。

  mysql> select BIN(12);

  -> '1100'

  OCT(N)

  返回八进制值N的一个字符串的表示,在此N是个长整型数字,这等价于CONV(N,10,8)。假如N是NULL,返回NULL。

  mysql> select OCT(12);

  -> '14'

  HEX(N)

  返回十六进制值N一个字符串的表示,在此N是个长整型(BIGINT)数字,这等价于CONV(N,10,16)。假如N是NULL,返回NULL。

  mysql> select HEX(255);

  -> 'FF'

  CHAR(N,...)

  CHAR()将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。NULL值被跳过。

  mysql> select CHAR(77,121,83,81,'76');

  -> 'MySQL'

  mysql> select CHAR(77,77.3,'77.3');

  -> 'MMM'

  CONCAT(str1,str2,...) (字符串连接函数)

  返回来自于参数连结的字符串。假如任何参数是NULL,返回NULL。能够有超过2个的参数。一个数字参数被变换为等价的字符串形式。

  mysql> select CONCAT('My', 'S', 'QL');

  -> 'MySQL'

  mysql> select CONCAT('My', NULL, 'QL');

  -> NULL

  mysql> select CONCAT(14.3);

  -> '14.3'

  LENGTH(str)

  OCTET_LENGTH(str)

  CHAR_LENGTH(str)

  CHARACTER_LENGTH(str)

  返回字符串str的长度。

  mysql> select LENGTH('text');

  -> 4

  mysql> select OCTET_LENGTH('text');

  -> 4

  注意,对于多字节字符,其CHAR_LENGTH()仅计算一次。

  LOCATE(substr,str)

  POSITION(substr IN str)

  返回子串substr在字符串str第一个出现的位置,假如substr不是在str里面,返回0.

  mysql> select LOCATE('bar', 'foobarbar');

  -> 4

  mysql> select LOCATE('xbar', 'foobar');

  -> 0

  该函数是多字节可靠的。

  LOCATE(substr,str,pos)

  返回子串substr在字符串str第一个出现的位置,从位置pos开始。假如substr不是在str里面,返回0。

  mysql> select LOCATE('bar', 'foobarbar',5);

  -> 7

  这函数是多字节可靠的。

  INSTR(str,substr)

  返回子串substr在字符串str中的第一个出现的位置。这和有2个参数形式的LOCATE()相同,除了参数被颠倒。

  mysql> select INSTR('foobarbar', 'bar');

  -> 4

  mysql> select INSTR('xbar', 'foobar');

  -> 0

  这函数是多字节可靠的。

  LPAD(str,len,padstr)

  返回字符串str,左面用字符串padstr填补直到str是len个字符长。

  mysql> select LPAD('hi',4,'??');

  -> '??hi'

  RPAD(str,len,padstr)

  返回字符串str,右面用字符串padstr填补直到str是len个字符长。

  mysql> select RPAD('hi',5,'?');

  -> 'hi???'

  LEFT(str,len)

  返回字符串str的最左面len个字符。

  mysql> select LEFT('foobarbar', 5);

  -> 'fooba'

  该函数是多字节可靠的。

  RIGHT(str,len)

  返回字符串str的最右面len个字符。

  mysql> select RIGHT('foobarbar', 4);

  -> 'rbar'

  该函数是多字节可靠的。

  SUBSTRING(str,pos,len)

  SUBSTRING(str FROM pos FOR len)

  MID(str,pos,len)

  从字符串str返回一个len个字符的子串,从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。

  mysql> select SUBSTRING('Quadratically',5,6);

  -> 'ratica'

 
2009-02-25 8:44

      在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据列自增属性。

  ISAM表

  如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。

  把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。

  当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。

  当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。

  如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。

  如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。

  如果用replace命令基于AUTO_INCREMENT数据列里的值来修改数据表里的现有记录,即AUTO_INCREMENT数据列出现在了replace命令的where子句里,相应的AUTO_INCREMENT值将不会发生变化。但如果replace命令是通过其它的PRIMARY KEY OR UNIQUE索引来修改现有记录的(即AUTO_INCREMENT数据列没有出现在replace命令的where子句中),相应的AUTO_INCREMENT值--如果设置其为NULL(如没有对它赋值)的话--就会发生变化。

  last_insert_id()函数可获得自增列自动生成的最后一个编号。但该函数只与服务器的本次会话过程中生成的值有关。如果在与服务器的本次会话中尚未生成AUTO_INCREMENT值,则该函数返回0。

  其它数据表的自动编号机制都以ISAM表中的机制为基础。

  MyISAM数据表

  删除最大编号的记录后,该编号不可重用。

  可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。

  可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。

  可使用复合索引在同一个数据表里创建多个相互独立的自增序列,具体做法是这样的:为数据表创建一个由多个数据列组成的PRIMARY KEY OR UNIQUE索引,并把AUTO_INCREMENT数据列包括在这个索引里作为它的最后一个数据列。这样,这个复合索引里,前面的那些数据列每构成一种独一无二的组合,最末尾的AUTO_INCREMENT数据列就会生成一个与该组合相对应的序列编号。

  HEAP数据表

  HEAP数据表从MySQL4.1开始才允许使用自增列。

  自增值可通过CREATE TABLE语句的 AUTO_INCREMENT=n选项来设置。

  可通过ALTER TABLE语句的AUTO_INCREMENT=n选项来修改自增始初值。

  编号不可重用。

  HEAP数据表不支持在一个数据表中使用复合索引来生成多个互不干扰的序列编号。

  BDB数据表

  不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。

  可重用编号。

  支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

  InnDB数据表

  不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。

  不可重用编号。

  不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。

  在使用AUTO_INCREMENT时,应注意以下几点:

  AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。

  设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍。

  AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。

  AUTO_INCREMENT数据列必须具备NOT NULL属性。

  AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。

  当进行全表删除时,AUTO_INCREMENT会从1重新开始编号。全表删除的意思是发出以下两条语句时:

  delete from table_name;

  or

  truncate table table_name

  这是因为进行全表操作时,MySQL实际是做了这样的优化操作:先把数据表里的所有数据和索引删除,然后重建数据表。如果想删除所有的数据行又想保留序列编号信息,可这样用一个带where的delete命令以抑制MySQL的优化:

  delete from table_name where 1;

  这将迫使MySQL为每个删除的数据行都做一次条件表达式的求值操作。

  强制MySQL不复用已经使用过的序列值的方法是:另外创建一个专门用来生成AUTO_INCREMENT序列的数据表,并做到永远不去删除该表的记录。当需要在主数据表里插入一条记录时,先在那个专门生成序号的表中插入一个NULL值以产生一个编号,然后,在往主数据表里插入数据时,利用LAST_INSERT_ID()函数取得这个编号,并把它赋值给主表的存放序列的数据列。如:

  insert into id set id = NULL;

  insert into main set main_id = LAST_INSERT_ID();

  可用alter命令给一个数据表增加一个具有AUTO_INCREMENT属性的数据列。MySQL会自动生成所有的编号。

  要重新排列现有的序列编号,最简单的方法是先删除该列,再重建该,MySQL会重新生连续的编号序列。

  在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数的LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,则第二次函数调用返回的就是expr的值。下面演示该方法的具体操作:

  先创建一个只有一个数据行的数据表:

  create table seq_table (id int unsigned not null);

  insert into seq_table values (0);

  接着用以下操作检索出序列号:

  update seq_table set seq = LAST_INSERT_ID( seq + 1 );

  select LAST_INSERT_ID();

  通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。

  该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作。

 
2009-02-25 8:42

      MySQL4.1以前版本服务器只能使用单一字符集,从MySQL4.1版本开始,不仅服务器能够使用多种字符集,而且在服务器、数据库、数据表、数据列以及字符串常数多个级别上设置不同的字符集。

  1.4.1. MySQL4.1以前版本

  MySQL4.1以前版本的字符集由服务器默认指定,默认值是编译系统时指定的字符集,该字符集也可通过在启动服务器时指定--default-character-set来修改。这种修改会对数据表的索引造成影响,因为索引的顺序是和字符集有关的,修改字符集会使这个已排序的顺序产生错误。要解决该问题,我们要用修改后的字符集的排序顺序重建表的索引。重建索引有以下几种方法:

  用mysqldump导出数据,再清除表里的内容,最后用导出文件重新导入。数据表的索引将在导入数时重建。该方法适用于所有数据表类型。

  删除索引,然后重建。用alter table命令或drop index和create index命令来完成。该方法也适用于所有数据表类型。但该方法需要我们了解重建索引的精确定义。

  MyISAM数据表的索引可以用myisamchk程序的--recover和--quick选项加上一个用来设定新字符集的--set-character-set选项进行重建。还可以用mysqlcheck程序的--repair和--quick选项或者一个带QUICK选项的REPLACE TABLE语句来重建索引,这种方式较方便。

  1.4.2. MySQL4.1以后版本

  MySQL4.1以后的版本对字符集的支持好了很多,具有以下新增功能:

  支持服务器同时使用多种字符集。

  允许在服务器,数据库,数据表,数据列等多级别上设置不同的字符集。

  服务器的默认字符集在编译时选定,但可在启动服务器时用--default-character-set选项来更改。

  用ALTER DATABASE db_name DEFAULT CHARACTER SET charset来设置数据库字符集。 如果只有default参数,则使用服务器的字符集。

  用CREATE TABLE table_name(...) CHARACTER SET = charset设置数据表字符集。如果charset为default,则使用数据表所在数据库的字符集作为数据表的字符集。

  在数据列中,可用CHARACTER SET charset属性来设置数据列的字符集。charset不能是default,如果没有该属性,则默认使用数据表的字符集。允许设置字符集的数据列有char,varchar(不带binary属性)及TEXT类型。

  用_charset str转换字符串常数的字符集。如:_utf8 'mysql',_latinl 'oracle'。该方法只适用于括在引号内的字符串,其它十六进制常数 、字符串表达式等可用CONVERT()函数进行转换,如:SELECT CONVERT( str USING charset)。

  通过MySQL提供的函数可进行字符集转换和查询。

  新增的COLLATE操作符使我们可按某一种字符集的排序顺序来处理另一种字符集的数据。如:SELECT a from t ORDER BY a COLLATE utf-8;

  用SHOW CHARACTER SET命令可显示服务器支持的字符集列表。

  当服务器转换到另一种字符集时,会自动对索引进行重新排序。

  通过UTF-8和UCS2字符集提供了Unicode支持。

  MySQL现在还不支持:1,在同一个字符串里混用不同字符集的字符;2,在同一个数据列里混用不同的字符集。

  1.4.3. 各级字符集的查询方法

  服务器级

  SHOW CHARACTER SET;可查出可供使用的所有字符集。

  SHOW VARIABLES LIKE 'character_set';可查出服务器的默认字符集。

  可查出数据库级的字符集。

  SHOW CREATE DATABASE db_name;

  两条命令可查出数据表的字符集。

  SHOW CREATE TABLE table_name;

  SHOW TABLE STATUS LIKE 'table_name'

  以下几命令可查出数据列的字符集:

  DESCRIBE table_name;

  SHOW COLUMNS FROM table_name;

  SHOW CREATE TABLE table_name;

  用CHARSET()函数可确定特定字符串,字符串表达式或数据列值相关联的字符串的字符集。如:SELECT CHARSET(str)。

  1.4.4. Unicode支持

  MySQL提供两种字符集来支持Unicode。一个是UTF-8,一种可变长的编码格式,需用1至4个字节来表示一个字符;另一个是UCS2,该字符集中的每个字符需要用两个字节来表示。

 
2009-02-25 8:41

       选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性。在选择数据列类型时,请从以下几个方面考虑:

  存放到数据列中的数据类型。

  数据值的取值范围。

  考虑性能和处理效率。

  数值操作比字符操作快。

  小类型的处理速度比大类型快。

  不同数据表中固定长度类型和可变长度类型的处理效率是不同的。

  可变长度类型在经过删除和修改操作后容易产生碎片,降低系统性能,需定期运行OPTIMIZE TABLE命令以优化数据表。

  固定长度类型由于有固定的长度,所以容易确定每条记录的起始点,可加快数据表的修复速度。

  在MyISAM和ISAM表中使用固定长度类型数据列有助改善数据库性能。

  在InnoDB表中,固定长度和可变长度数据列类型都以相同方式存储,所以固定长度数据列类型并没有性能优势,反而由于可度长度数据列类型由于占用存储空间较少,所以处理速度会快些。

  可索引类型能加快数据的查询速度。

  明确指定数据列的NOT NULL属性可使MySQL在检索过程中不用去判断数据列是否是NULL,所以可加快处理速度。

  数据如何进行比较,是否区分大小写。

  是否要在数据列上建立索引。

 
2009-02-25 8:40

1.表达式操作符
Table 1 算术操作符

操作符 语法 含义
+ a + b 相加
- a - b 相减
- - a 求负
* a * b 乘法
/ a / b 除法
% a % b 求余

Table 2. 逻辑操作符

操作符 语法 含义
AND 或 && a AND b 或 a && b 逻辑与,若两个操作数同时为真,则为真
OR 或 || a OR b 或 a || b 逻辑或,只要有一个操作数为真,则为真
XOR a XOR b 逻辑异或,若有且仅有一个操作数为真,则为真
NOT 或 ! NOT a 或 !a 逻辑非,若操作数为假,则为真

Table 3. 位操作符

操作符 语法 含义
& a & b 按位与,若操作数同位同为1,则该位为1
| a | b 按位或,若操作数同位有一位为1,则该位为1
^ a ^ b 按拉异或,若操作数同一位分别为1和0,则该位为1
<< a << b 把a中的各个位左移b个位置
>> a >> b 把a中的各个位右移b个位置

Table 4. 比较操作符

操作符 语法 含义
= a = b 若两个操作数相等,则为真
<=> a <=> b 若两个操作数相等,则为真,可用于NULL值比较
!= 或 <> a != b 或 a <> b 若两个操用数不等,则为真
< a < b 若a小于b,则为真
<= a <= b 若a小于或等于b,则为真
> a > b 若a大于b,则为真
>= a > b 若a大于或等于b,则为真
IN a IN (b1,b2,...) 若a等于b1,b2,...中的某一个,则为真
BETWEEN a BETWEEN b AND c 若a在b和c之间(包括b和c),则为真
NOT BETWEEN a NOT BETWEEN b AND c 若a不在b和c之间(包括b和c),则为真
LIKE a LIKE b SQL模式匹配,若a匹配b,则为真
NOT LIKE a NOT LIKE b SQL模式匹配,若a不匹配b,则为真
REGEXP a REGEXP b 正则表达式匹配,若a匹配b,则为真
NOT REGEXP a NOT REGEXP b 正则表达式匹配,若a不匹配b,则为真
IS NULL a IS NULL 若a为NULL,则为真
IS NOT NULL a IS NOT NULL 若a不为NULL,则为真

   
LIKE模式匹配中的“%”匹配任意个字符,“_”匹配一个字符。匹配不区分大小写字符。

Table 5. 操作符优先级(由高至低排列)

操作符
BINARY,COLLATE
NOT、!
^
XOR
-(一元求负操作符)、~(一元取反操作符)
*、/、%
+、-
<<、>>
&
|
<、<=、=、<=>、!=、<>、>=、>、IN、IS、LIKE、REGEXP、RLIKE
BETWEEN、CASE、WHEN、THEN、ELSE
AND、&&
OR、||
:=

2. 类型转换
在MySQL的表达式中,如果某个数据值的类型与上下文所要求的类型不相符,MySQL则会根据将要进行的操作自动地对数据值进行类型转换。如:

1 + '2'      会转换成1 + 2 = 3
1+ 'abc'     会转换成1 + 0 = 1 由于abc不能转换成任何的值,所以默认为0
MySQL会根据表达式上下文的要求,把字符串和数值自动转换为日期和时间值

对于超范围或非法的值,MySQL也会进行转换,但转换出来的结果是错误的。出现该情况时,MySQL会提示警告信息,我们可捕获该信息以进行相应的处理。

 
2009-02-25 8:40

       数据库是数据的集合,与数学的集合论有密不可分的关系。

  为提高查询速度,我们可以:

  对数据表添加索引,以加快搜索速度;

  通过编程技巧最大限度地利用索引;

  优化查询语句,以使服务器最快响应多客户的请求。

  研究硬件处理过程,减少物理约束。

  2.1. 索引

  索引技术是关系数据查询中最重要的技术。如果要加提升数据库的性能,索引优化是首先应该考虑的。因为它能使我们的数据库得到最大性能方面的提升。

  索引的优点:

  没有索引的表是没有排序的数据集合,如果要查询数据需进行全表扫描。有索引的表是一个在索引列上排序了数据表,可通过索引快速定位记录。在MyISAM和ISAM数据表中,数据行保存在数据文件中,索引保存在索引文件中。BDB与InnoDB数据表把数据与索引放在同一个文件中。

  在多表关联查询中,索引的作用就更大。如果没有索引,在最坏的情况下,全表扫描的次数可能是各表数据行的组合个数,可能是一个天文数字。这样的查询是破坏性的,可能会造成数据库瘫痪。

  对于使用了MIN()或是MAX()函数的查询,如果相关的数据列上有索引,MySQL能直接找到该最大、最小值的行,根本不用一个一个地去检查数据行。

  索引加快ORDER BY 和 GROUP BY子句的操作。

  当在数值型数据列上查询数据,而该列有索引,索引能使MySQL根本不用去读取数据行,直接从索引取值。

  索引的缺点:

  索引需占用磁盘空间。

  索引会减慢在索引数据列上的插入、删除和修改操作。

  索引列的选择

  索引应该创建在搜索、排序、分组等操作所涉及的数据列上。也就是说,在where子句,关联检索中的from子句、order by或group by子句中出现过的数据列最适合用来创建索引。

  尽量使用唯一索引,它能使索引发挥最好的效能。

  尽量用比较短的值进行索引。当对字符串进行索引时,应该指定一个前缀长度,比如对字符串的前10位或20位的字符进行排序,而不用把整个字符串几十个字符用来索引排序。这样能减少磁盘I/O,提高处理速度。最重要的一点是,键值越短,索引缓冲区里容纳的键值也就越多,而MySQL同时保存在内存里的索引越多,索引缓冲区的命中率也就越高。当然,只对数据列第一个字符进行索引是没什么意义的。

  充分利用最左前缀。所谓最左前缀也就是在复合索引中最边的索引列。如复合索引(a,b,c) ,其中a就是最左前缀。它是使用率最高的索引,需认真选择。

  不要建太多索引,索引是会消耗系统资源的,要适可而止。

  索引主要用于<、<=、=、>=、>、BETWEEN等的比较操作中,所以索引应该建立在与这样操作相关的数据列上。

  利用慢查询日志来找出性能差的查询,通过mysqldumpslow可查看该日志。针对性能差的查询可利用索引来加快查询速度。

  2.2. 查询优化程序

  当我们发一条查询命令时,MySQL分对它进行分析,以优化查询。把explain语名放到查询前面可显示查询的执行路线,对优化查询提供有用的信息。以下几个原则可帮助系统挑选和使用索引:

  尽量对同类型的数据列进行比较。如:VARCHAR(5)和VARCHAR(5)是同类型的,CHAR(5)和VARCHAR(5)是不同类型的。

  尽量让索引的数据列在比较表达式中单独出现,不要把它包含在函数或复杂表达式。否则索引会不起作用。

  尽量不要在LIKE模式的开头使用通配符。如:%string%。

  对于MyISAM和BDB数据表,用ANALYZE TABLE语句让服务器对索引键值的分布进行分析,为优化程序提供更有价值的信息。另一个方法是用myisamchk --analyze(适用于MyISAM表)或isamchk --analyze(适用于ISAM表)命令。

  用EXPLAIN语句来分析查询语句的执行效率。检查查询所使用的索引是不是能够迅速地排除不符合条件的数据行,如果不是,可以试着用STRAIGHT_JOIN强制各有关数据表按指定顺序进行关联。

  尝试查询的不同写法,比较运行情况。

  不要滥用MySQL的类型自动转换功能。自动转换会减慢查询的速度并会使有关的索引失效。

 
2009-02-25 8:39

       数据列类型与查询效率

  选用适当的数据列类型有助于提高查询命令的执行速度,下面是几点关于如何选择合适数据列类型的建议:

  尽量选用尺寸较小的数据列。这样能节约磁盘空间和加快查询速度。如果较短的数据列上建有索引,则索引的处理速度会进一步提高。

  针对数据列类型,尽量选择最适用的数据表类型。如固定长度数据列在MyISAM或ISAM数据表中的速度是最快的,所以在这样数据表中尽量使用char类型而不是varchar类型来保存字符串数据。对于InnoDB数据表类型,由于varchar类型可有效减少占用空间,从而减少磁盘I/O,所以使用varchar类型是有利的。对于BDB类型数据表,使用定长和不定长列类型的区别就不大,可任选一种。

  尽量把数据列声明为NOT NULL,以节约存储空间和加快处理速度。

  对于取值范围有限的数据列,考虑使用ENUM数据列类型。ENUM数据列类型在MySQL中的处理速度是很快。

  使用PROCEDURE ANALYSE()语句来分析数据表,它会对数据列的声明提出建议,我们可根据建议进行修改。

  select * from table_name PROCEDURE ANALYSE();

  select * from table_name PROCEDURE ANALYSE(16,256); #(16,256)含义是:如果某列的不同取值在16个以上或长度超过256字节,就不提出使用ENUM的建议。

  用OPTIMIZE TABLE语句对容易出现碎片的数据表进行整理。包含可变长数据列的数据表都会产生碎片,从而占用多余的磁盘空间和影响查询速度。所以要定期运行OPTIMIZE TABLE语句以防止数据表查询性能降低。但该语句只对MyISAM数据表有效。对各种数据表通用的碎片整理方法是这样的:先用工具程序mysqldump导出数据表,再删除数据表后重建,如:

  $ mysqldump --opt db_name table_name > dump.sql

  $ mysql db_name < dump.sql

  把非结构化和变化大的数据放在BLOB数据列里,定期用OPTIMIZE TABLE命令优化。

  人为地给数据表增加一个数据列,以充当索引。做法是这样的,先根据数据表里的其它数据列计算出一个散列值,并保存在一个数据列里,然后通过搜索散列值来检索数据行。注意,该技巧只适用于精确匹配型查询。散列值在大于,小于等的操作中不起作用。散列值可以MD5()(适用于3.23及以上版本),SHA1()(适用于4.0.1及以上版本),CRC32()(适用于4.1及以上版本)等函数生成。使用散列值支检索BLOB和TEXT值的做法比直接检索BLOB和TEXT本身的做法快。

  尽量避免对大尺寸的BLOB值进行检索。如果要检索都应该通过它的上面提到散列值先进行筛选。而不应该盲目地在网络中传送大量BLOB值。

  如果把BLOB值剥离到另外一个数据表里去,可实现数据表中其它数据列转变成固定长度数据列的话。就即可减少数据表碎片,又可使在原始表中的select *查询不会把大尺寸的BLOB值不必要地通过网络传送。

 
2009-02-25 8:39

       有效地加载数据

  有时我们需大量地把数据加载到数据表,采用批量加载的方式比一个一个记录加载效率高,因为MySQL不用每加载一条记录就刷新一次索引。下面介绍几个有助于加快数据加载的操作:

  使用LOAD DATA语句要比INSERT语句的加载速度快。

  LOAD DATA比LOAD DATA LOCAL语句的效率高。前者可由服务器直接从本地磁盘读取加载数据,后者需由客户程序去读取文件并通过网络传送到服务器。

  如果一定要用INSERT语句,应尽量在一条语句中插入多个数据行。

  如果必须使用多条INSERT语句,则应尽量把它们集中在一起放到一个事务中进行处理,而不是在自动提交模式下执行它们:如:

  BEGIN;

  INSERT INTO table_name values (...);

  INSERT INTO table_name values (...);

  INSERT INTO table_name values (...);

  ...

  COMMIT;

  对于不支持事务的表,应对表进行写锁定,然后在表锁定期间对表进行INSERT操作,如:

  LOCK TABLES table_name WRITE;

  INSERT INTO table_name ...;

  INSERT INTO table_name ...;

  INSERT INTO table_name ...;

  ...

  UNLOCK TABLES;

  利用客户/服务器通信协议中的压缩功能以减少网络传输的数据量。但该压缩会消耗大量的系统资源,所以小心使用。

  尽量让MySQL插入默认值。不要在INSERT中写太多值,以减少网络传输量和服务器端的语法分析时间。

  对于MyISAM和ISAM数据表,如果需加载大量数据,应先建立一个没索引的表,加载数据后再创建索引。该方法不适用于InnoDB或BDB数据表。

  禁用和重新激活索引的方法有两种:

  使用ALTER TABLE语句的DISABLE KEYS和ENABLE KEYS命令,如:

  ALTER TABLE table_name DISABLE KEYS;

  ALTER TABLE table_name ENABLE KEYS;

  使用myisamchk或isamchk工具。如:

  $ myisamchk --keys-used=0 table_name #禁止

  $ myisamchk --recover --quick --key-used=n table_name #激活

  n是用来表明需要激活索引的位掩码,第0位对应第一个索引,如果有三个索引,n值就是7(二进制111)。索引编号可以下命令确定:

  $ myisamchk --description table_name

 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

很客观啊,下次再淘宝买东西要精挑细选啊,不过淘宝上的好东西真的不少啊。
 

该文的作者很无知。 任何浏览器进行网上付费都需要特定的插件,IE给你安装了只不过不
 

你好 非常想和您请教下 asp技术 我的qq1245858757 期待您的佳音!!
 

fdsafdsafds
 

我是昨天看的,结局好感动人呀,
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu