有关max_connect_errors参数
[
2009/02/18 17:58 | by askwan ]
2009/02/18 17:58 | by askwan ]
配置文件中max_connect_errors这个参数表示,同一个IP地址最大错误连接数目,就是说如果连接失败,并且超过这个数字后,mysql将拒绝这个IP再次连接,这个数字设置的太大没有必要,设置的小一点,可以防止某些恶意攻击。500-1000比较合适,看有的兄弟把这个值设置为10000000,真是汗一个,如果遇上有人搞破坏,撑不到这个数,机器就已经挂了,只能你硬重启,也无从发现问题;设置的小一点,这样应用程序和数据库之间的连接出现问题了,发现后也可以及时的处理。
如果发现是网络原因,最后应用程序无法连接数据库而报错,只需要在数据库上flush-hosts就行。
如果发现是网络原因,最后应用程序无法连接数据库而报错,只需要在数据库上flush-hosts就行。
Mysql复合索引Multiple-Column Indexes
[
2009/02/18 15:11 | by askwan ]
2009/02/18 15:11 | by askwan ]
Mysql可以可以为一个表的多个列创建索引,最多为15个列,并且可以索引列的前缀,以减少索引长度,提高效率。
多列索引实际上是“considered a sorted array containing values that are created by concatenating the values of the indexed columns” 包含通过连接索引列的值而创建的值的排序的数组。
手册上的例子:
这样就为test表创建了一个多列索引,要使其对SELECT语句产生效果,WHERE语句右边首先要是第一个键值last_name,其次是
first_name, 否认建立的索引不起作用。
总结一下:
对于形如 INDEX(A,B)形式的多列索引,如果查询操作之需要首先用到A列的索引,就可以使用这种多列索引,同时要用到A和B的那当然没有问题,如果只用到B,那就要注意语句的写法了。
例如例子中:
而这个确没有用到last_name索引,索引没有用了
对于形如 INDEX(A,B,C)形式多列索引,简单的说 ,就是可以当作(A),(A,B),(A,B,C)的索引来使用,但是不能当作(B),(B,C),(C)的索引来使用,其他依次类推!
对于(A,B,C)这样的索引性能与单列的组合索引(A) ,(B),(C)性能高低问题,这里给了一个答案:http://www.mysqlperformanceblog.com/2008/08/22/multiple-column-index-vs-multiple-indexes/
作者的总结:
大意是说对多个列建索引比对每个列分别建索引更有优势……。
--------------END---------------
多列索引实际上是“considered a sorted array containing values that are created by concatenating the values of the indexed columns” 包含通过连接索引列的值而创建的值的排序的数组。
手册上的例子:
CREATE TABLE test (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX name (last_name,first_name)
);
这样就为test表创建了一个多列索引,要使其对SELECT语句产生效果,WHERE语句右边首先要是第一个键值last_name,其次是
first_name, 否认建立的索引不起作用。
总结一下:
对于形如 INDEX(A,B)形式的多列索引,如果查询操作之需要首先用到A列的索引,就可以使用这种多列索引,同时要用到A和B的那当然没有问题,如果只用到B,那就要注意语句的写法了。
例如例子中:
SELECT * FROM test WHERE last_name='Widenius';
只用到 last_name索引SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';
SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty');
SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';
SELECT * FROM test WHERE first_name='Michael';
而这个确没有用到last_name索引,索引没有用了
对于形如 INDEX(A,B,C)形式多列索引,简单的说 ,就是可以当作(A),(A,B),(A,B,C)的索引来使用,但是不能当作(B),(B,C),(C)的索引来使用,其他依次类推!
对于(A,B,C)这样的索引性能与单列的组合索引(A) ,(B),(C)性能高低问题,这里给了一个答案:http://www.mysqlperformanceblog.com/2008/08/22/multiple-column-index-vs-multiple-indexes/
作者的总结:
Quotation
Conclusion: For benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table picking only one index on the pair.
大意是说对多个列建索引比对每个列分别建索引更有优势……。
--------------END---------------
索引更新有关的参数DELAY_KEY_WRITE
[
2009/02/18 12:49 | by askwan ]
2009/02/18 12:49 | by askwan ]
对于一个比较大的表,对某些列加了索引后,可以加快数据检索速度,但是,对数据修改操作却会很慢,因为每修改一次记录,索引就必须刷新一次,所以说,索引也是一把双刃剑,为了在某种程度弥补这个问题,就引出了我今天要说了这个参数
DELAY_KEY_WRITE
这个参数的意义是,在表被关闭之前,对表的修改操作只是更新数据到磁盘,而不更新索引到磁盘,而是把对索引的更新结果放在内存里,当表被关闭的时候再一起更新到磁盘里。所以,这个参数的作用还是很明显的,它可以暂时阻止Mysql在数据表的记录被改变是立刻对索引进行刷新,对索引的刷新将等到全部记录修改完毕,表被关闭后再进行,从而避免了频繁的刷新索引带来系统的开销,一定程序上提高了性能。
我们可以使用ALTER TABLE table DELAY_KEY_WRITE = 1,让这个参数对这table这个表生效,也可以在mysql启动的时候加入参数--delay_key_write[= OFF | ON | ALL],ALL表示这个参数将对所有的打开的表都有效。要注意一点,这个参数值对MYISAM存储引擎有效。
Profile Mysql
[
2009/02/17 16:28 | by askwan ]
2009/02/17 16:28 | by askwan ]
Mysql从5.0.37和之后的版本中加入了一个Profiler,可以用来分析SQL语句性能瓶颈,多数人对Explain熟悉,但这个比较陌生一点,本篇对这个profile部分做个小节。
用法:
SHOW PROFILES 和SHOW PROFILE 语句显示Mysql的一些概要分析信息,并指示当前的Session下各种资源使用情况统计。
这里有个Profiling变量,默认是OFF(值为0),要使用,先开启:
mysql> SET profiling = 1;
show profile显示了一系列最近执行过的语句,变量profiling_history_size 控制了可以记录的语句条数,默认是15条,最大值100,
设置为0,则相当于禁用了profiling!
在一个特定Session中,所有最近执行的语句都会被记录并被统计分析,只有其本身(SHOW PROFILES 和SHOW PROFILE)不被记录。
关于Type的值,这里有详细的说明:http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html,不再赘述。
演示一下使用方法:
用法:
Quotation
SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]
type:
ALL
| BLOCK IO
| CONTEXT SWITCHES
| CPU
| IPC
| MEMORY
| PAGE FAULTS
| SOURCE
| SWAPS
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]
type:
ALL
| BLOCK IO
| CONTEXT SWITCHES
| CPU
| IPC
| MEMORY
| PAGE FAULTS
| SOURCE
| SWAPS
SHOW PROFILES 和SHOW PROFILE 语句显示Mysql的一些概要分析信息,并指示当前的Session下各种资源使用情况统计。
这里有个Profiling变量,默认是OFF(值为0),要使用,先开启:
mysql> SET profiling = 1;
show profile显示了一系列最近执行过的语句,变量profiling_history_size 控制了可以记录的语句条数,默认是15条,最大值100,
设置为0,则相当于禁用了profiling!
在一个特定Session中,所有最近执行的语句都会被记录并被统计分析,只有其本身(SHOW PROFILES 和SHOW PROFILE)不被记录。
关于Type的值,这里有详细的说明:http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html,不再赘述。
演示一下使用方法:





