如何提高mysql的选择性能?

时间:2013-07-07 14:37:58

标签: mysql sql performance

我有来自数据库(mysql)表的1034961行数据。

结构..

table:tb_blog_image

    |   id(pk)   |   link(TEXT)   |   img_link(TEXT)   |
    |     1      |blogpost.com/aaa|http://sky.png      |
    |     2      |blogpost.com/aaa|http://girl.png     |
    |     3      |blogpost.com/aaa|http://cad.png      |

现在,我想从tb_blog_images中选择特定的img_link列表。

SQL ..

    select link, img_link
    from tb_blog_image
    where link = 'blogpost.com/aaa';

结果3864 6.37sec

如何提高选择性能? 将链接列设为索引? 表规范化?

我想在1秒内运行。

我想听各种提示。

4 个答案:

答案 0 :(得分:4)

理想情况下,您在程序中使用主键(id)。

但如果失败,链接列上的索引将解决您的问题。现在,您运行的查询要求从磁盘加载表中的所有一百万行,然后将其与查询字符串值进行比较。使用索引,可以将其减少到不超过三个或四个磁盘读取。

此外,text数据类型与表的其余部分分开存储,效率不高。我会将两个文本列重新定义为varchar(300),这对于可能遇到的任何URL来说肯定足够长,但也提供了更高效的存储:TEXT类型实际上是(可能)长字段像备忘录或网页内容。

答案 1 :(得分:2)

您可能对要针对精细演出进行调整的变量感兴趣。

Set global thread_cache_size = 4;
Set global query_cache_size = 1024*1024*1024;
Set global query_cache_limit=768*1024;
Set global query_cache_min_res_unit = 2048;
Set long_query_time = 5;

来源:

http://www.snip2code.com/Snippet/1171/List-of-Variables-to-be-set-in-MySQL-for?fromPage=1

答案 2 :(得分:1)

您正在从单个表中选择数据,因此执行时间的改进仅通过索引

可以使用一个ALTER TABLE语句在表上创建多个索引。这相对有效,因为表的聚簇索引只需要扫描一次

有关详细信息,请参阅 http://dev.mysql.com/doc/innodb/1.1/en/innodb-create-index-examples.html

答案 3 :(得分:0)

我不知道您使用的是MySQL以外的哪种语言,但您可以选择link,而不是同时选择img_linkid列。

代码将是这样的:

 select id
    from tb_blog_image
    where link = 'blogpost.com/aaa';

// Now Fetch The Rows

Echo the rows using a loop one by one {

// Inside this loop, do this 

  select link, img_link
    from tb_blog_image
    where link = $id 

// $id is a variable of the current row

 echo "whatever you want";

}

请告诉我,您使用哪种语言,如果是PHP,我可以提供帮助。

让我知道,如果它改善了表现。