Pages: 7/12 First page Previous page 2 3 4 5 6 7 8 9 10 11 Next page Final page [ View by Articles | List ]
     下面是最常用的Mysql内置函数,今天记录下来,方便日后查阅

mysql索引优化之Using filesort

[不指定 2009/02/24 18:54 | by askwan ]
      用Explain分析SQL语句的时候,经常发现有的语句在Extra列会出现Using filesort,根据mysql官方文档对他的描述:
Quotation
MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause.

中文手册上翻译的很别扭:
Quotation
“Mysql需要额外的一次传递,以找出如何按排序顺序检索行,通过根据联接类型浏览所有行并为所有匹配where子句的行保存排序关键字和行的指针来完成排序,然后关键字被排序,并按排序顺序检索行。”


总的来说,Using filesort 是Mysql里一种速度比较慢的外部排序,如果能避免是最好的了,很多时候,我们可以通过优化索引来尽量避免出现Using filesort,从而提高速度。

这里举个简单的例子:

CREATE TABLE `testing` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `room_number` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `room_number` (`room_number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


写个存储过程askwan,插入10万条测试数据

google-perftools的TCMalloc

[不指定 2009/02/19 10:31 | by askwan ]
       我这两天在一台DB上的实际应用测试,发现和不使用之前负载降低30%左右,可以理解为性能提高了30%!TCMalloc号称最快的Malloc,果然不虚,以前出来这个东西的时候,没实际测试,今天真实体验了一把。效果还是不错的。

     因为开始不知道对于64位的系统,要先安装libunwind库,折腾了不少时间,给提个醒。
最新版本是1.0了

下载:
http://google-perftools.googlecode.com/files/google-perftools-1.0.tar.gz

项目主页:
http://code.google.com/p/google-perftools/

相关文章:
http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html
      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: , ,
Pages: 7/12 First page Previous page 2 3 4 5 6 7 8 9 10 11 Next page Final page [ View by Articles | List ]