我有来自数据库(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秒内运行。
我想听各种提示。
答案 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_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,我可以提供帮助。
让我知道,如果它改善了表现。