Pages: 6/10 First page Previous page 1 2 3 4 5 6 7 8 9 10 Next page Final page [ View by Articles | List ]

有关max_connect_errors参数

[不指定 2009/02/18 17:58 | by askwan ]
    配置文件中max_connect_errors这个参数表示,同一个IP地址最大错误连接数目,就是说如果连接失败,并且超过这个数字后,mysql将拒绝这个IP再次连接,这个数字设置的太大没有必要,设置的小一点,可以防止某些恶意攻击。500-1000比较合适,看有的兄弟把这个值设置为10000000,真是汗一个,如果遇上有人搞破坏,撑不到这个数,机器就已经挂了,只能你硬重启,也无从发现问题;设置的小一点,这样应用程序和数据库之间的连接出现问题了,发现后也可以及时的处理。

  如果发现是网络原因,最后应用程序无法连接数据库而报错,只需要在数据库上flush-hosts就行。
      Mysql可以可以为一个表的多个列创建索引,最多为15个列,并且可以索引列的前缀,以减少索引长度,提高效率。
多列索引实际上是“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---------------
Tags: , ,
  
      对于一个比较大的表,对某些列加了索引后,可以加快数据检索速度,但是,对数据修改操作却会很慢,因为每修改一次记录,索引就必须刷新一次,所以说,索引也是一把双刃剑,为了在某种程度弥补这个问题,就引出了我今天要说了这个参数

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 ]
       Mysql从5.0.37和之后的版本中加入了一个Profiler,可以用来分析SQL语句性能瓶颈,多数人对Explain熟悉,但这个比较陌生一点,本篇对这个profile部分做个小节。

用法:
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


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,不再赘述。

演示一下使用方法:
Tags: , ,
Pages: 6/10 First page Previous page 1 2 3 4 5 6 7 8 9 10 Next page Final page [ View by Articles | List ]