2013-07-07 40 views
1

我有从数据库(mysql)表1034961行数据。如何提高mysql中的select性能?

结构..

表: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'; 

结果38rows 6.37sec

如何提高选择性能? 使链接列索引? 表正常化?

我想在1秒内运行。

我想听各种提示。

+1

您需要在“链接”列中添加索引 –

+1

绝对需要索引。标准化链接列也可能值得研究。 – Jon

+0

您可以在表中添加一个fultext索引:http://www.petefreitag.com/item/477.cfm – Gimmy

回答

4

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

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

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

+0

谢谢。我修改链接,文本到varchar(300)。和索引。 – ash84

+0

什么是您的新查询时间? – Curt

+0

选择查询在1秒内​​运行。 – ash84

0

我不知道,你正在使用其他的比MySQL的语言,但不是同时选择linkimg_link列,您可以选择id

该代码将是这样的:

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。

让我知道,如果它提高了性能。