Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高mysql中的select性能?_Mysql_Sql_Performance - Fatal编程技术网

如何提高mysql中的select性能?

如何提高mysql中的select性能?,mysql,sql,performance,Mysql,Sql,Performance,我有来自数据库(mysql)表的1034961行数据 结构 表:tb_博客_图像 | 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|htt

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

结构

表:tb_博客_图像

    |   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_图片中选择特定的img_链接列表

sql

结果38行6.37秒

如何提高select性能? 是否将列链接到索引? 表规范化

我想在1秒内跑


我想听听各种提示

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

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


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

理想情况下,您应该使用主键(id)在你的程序中

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


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

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

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

有关更多详细信息,请参阅

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

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

有关更多详细信息,请参阅

您可能对为获得良好性能而调整的变量感兴趣

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;
资料来源:


您可能对为获得良好性能而调整的变量感兴趣

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;
资料来源:


我不知道除了MySQL之外您使用的是哪种语言,但是您可以选择
id
而不是同时选择
link
img\u link

代码如下所示:

 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,我可以提供帮助


如果它提高了性能,请告诉我。

我不知道,除了MySQL,您使用的是哪种语言,但是您可以选择
link
img\u 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,我可以提供帮助


如果它提高了性能,请告诉我。

您需要在
链接中添加索引。规范化链接列可能也值得研究。您可以向表中添加fultext索引:您可以将数据类型从文本更改为其他类型。我建议您必须将其更改为较小尺寸的varchar。但是怎么能这么久呢?我以前从未执行sql超过6.37秒。在该查询前面加上Explain,然后发布输出。我们可以猜到答案,在link列上添加一个索引,但是6秒来测试38行似乎有点过分。你需要在
链接
列中添加一个索引。当然需要索引。规范化链接列可能也值得研究。您可以向表中添加fultext索引:您可以将数据类型从文本更改为其他类型。我建议您必须将其更改为较小尺寸的varchar。但是怎么能这么久呢?我以前从未执行sql超过6.37秒。在该查询前面加上Explain,然后发布输出。我们可以猜测答案,在链接列上添加一个索引,但是用6秒来测试38行似乎有点难。您的新查询时间是多少?选择查询在1秒内运行。您的新查询时间是多少?选择查询在1秒内运行。