GVKun编程网logo

如何在MySQL中通过连接提高性能的顺序

13

本篇文章给大家谈谈如何在MySQL中通过连接提高性能的顺序,同时本文还将给你拓展MySQL中复合索引中列的顺序对性能的影响、MySql的连接池:如何提高性能、MySQL连接被重置,如何通过连接回收和空

本篇文章给大家谈谈如何在MySQL中通过连接提高性能的顺序,同时本文还将给你拓展MySQL中复合索引中列的顺序对性能的影响、MySql的连接池:如何提高性能、MySQL连接被重置,如何通过连接回收和空闲超时来优化连接池的性能?、MySQL连接被重置,如何通过连接复用来提高连接池的利用率?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何在MySQL中通过连接提高性能的顺序

如何在MySQL中通过连接提高性能的顺序

我正在开发一个社交网络跟踪应用程序。即使连接正确,也可以正常工作。但是,当我添加order by子句时,总查询执行时间要长100倍。我用于获取不带order
by子句的twitter_users的以下查询。

SELECT DISTINCT  `tracked_twitter`.id
FROM tracked_twitter
INNER JOIN  `twitter_content` ON  `tracked_twitter`.`id` = `twitter_content`.`tracked_twitter_id` 
INNER JOIN  `tracker_twitter_content` ON  `twitter_content`.`id` = `tracker_twitter_content`.`twitter_content_id` 
AND  `tracker_twitter_content`.`tracker_id` =  '88'
LIMIT 20

显示第0-19行(共20行,查询耗时0.0714秒)

但是当我添加order by子句(在索引列上)时

SELECT DISTINCT  `tracked_twitter`.id
FROM tracked_twitter
INNER JOIN  `twitter_content` ON  `tracked_twitter`.`id` =  `twitter_content`.`tracked_twitter_id` 
INNER JOIN  `tracker_twitter_content` ON  `twitter_content`.`id` =  `tracker_twitter_content`.`twitter_content_id` 
AND  `tracker_twitter_content`.`tracker_id` =  '88'
ORDER BY tracked_twitter.followers_count DESC 
LIMIT 20

显示第0-19行(共20行,查询耗时13.4636秒)

解释
在此处输入图片说明

当我仅在其表中实现order by子句时,不会花费太多时间

SELECT * FROM `tracked_twitter` WHERE 1 order by `followers_count` desc limit 20

显示第0-19行(共20行,查询耗时0.0711秒)[followers_count:68236387-10525612]

表创建查询如下

CREATE TABLE IF NOT EXISTS `tracked_twitter` (
    `id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`handle` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`location` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,`description` text COLLATE utf8_unicode_ci,`profile_image` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`followers_count` int(11) NOT NULL,`is_influencer` tinyint(1) NOT NULL DEFAULT '0',`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`gender` enum('Male','Female','Other') COLLATE utf8_unicode_ci 
     DEFAULT NULL,PRIMARY KEY (`id`),KEY `followers_count` (`followers_count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

因此,当我在其表上执行它时,join并不会因工作良好而减慢查询和排序的速度。那么如何提高性能呢?

更新1

@GordonLinoff方法解决是否只需要父表的结果集。我想知道每人tweets的数量(与tracked_twitter表匹配的twitter_content的数量)。我该如何修改?如果我想在推文内容上使用数学函数,该怎么做?

SELECT  `tracked_twitter` . *,COUNT( * ) AS twitterContentCount,retweet_count + favourite_count + reply_count AS engagement
FROM  `tracked_twitter` 
INNER JOIN  `twitter_content` ON  `tracked_twitter`.`id` =  `twitter_content`.`tracked_twitter_id` 
INNER JOIN  `tracker_twitter_content` ON  `twitter_content`.`id` =  `tracker_twitter_content`.`twitter_content_id` 
WHERE  `is_influencer` !=  '1'
AND  `tracker_twitter_content`.`tracker_id` =  '88'
AND  `tracked_twitter_id` !=  '0'
GROUP BY  `tracked_twitter`.`id` 
ORDER BY twitterContentCount DESC 
LIMIT 20 
OFFSET 0

MySQL中复合索引中列的顺序对性能的影响

MySQL中复合索引中列的顺序对性能的影响

select * from dlog_user order by online_status, username

先看上面这个内联的SQL语句,username是dlog_user表的主键,dlog_friend有一个由 username和 friend_username组合而成的复合主键。

测试条件一


dlog_user 和 dlog_friend 两个表除了主键外没有建任何索引,对这条SQL语句EXPLAIN的结果是 dlog_user 做了全表查询(type=ALL),Extra信息是use filesort

测试条件二

dlog_user 增加复合索引

create index idx_online_status on dlog_user( username, online_status);

再次EXPLAIN SQL语句,还是全表查询以及 use filesort

测试条件三

修改复合索引,将 username 和 online_status 顺序调换一下,这回得到的结果是:type=index, Extra=空

索引起作用了!

测试条件四

更改SQL语句如下:

select a.* from dlog_user a inner join dlog_friend b on a.username=b.friend_username where b.username=''ld'' order by a.online_status desc,a.username

也就是ORDER BY的时候,两个字段的排序方式相反,这时不管怎么调整索引,执行此SQL语句都要进行全表查询以及 user filesort。

结论

1. ORDER BY 中的字段必须按照SQL语句中的顺序来建索引;
2. ORDER BY 中的字段的排序顺序必须一直,否则索引无效。
3. 建了索引不一定就有效,用实际的SQL检查一下。

附录(MySQL文档对use filesort的解释)

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. The keys then are sorted and the rows are retrieved in sorted order.

其他数据库不知道如何!

补充

SQL SERVER同样存在此问题,而且像这种情况如果在SQL SERVER分开对两个字段建索引是无效的。

MySql的连接池:如何提高性能

MySql的连接池:如何提高性能

随着互联网的发展,越来越多的业务需要使用数据库来存储和管理数据。对于mysql这样的关系型数据库,连接池是提高性能的重要手段之一。在本文中,我们将介绍mysql连接池的概念、原理和使用方法,以及如何通过调整连接池参数来提高性能。

一、MySql连接池的概念及原理

MySql连接池是一种数据库连接的管理机制,它可以在应用程序与数据库之间建立一组固定数量的连接,然后将这些连接放入一个连接池中,供应用程序使用。应用程序需要访问数据库时,可以从连接池中获取一个空闲连接,用完后再将其释放。这样可以避免频繁地创建和销毁连接,从而提高应用程序的性能和可靠性。

连接池的原理是通过提前创建一定数量的连接,放入连接池中。应用程序需要连接数据库时,它可以从连接池中获取一个连接,并将其标记为“正在使用”。当应用程序使用完连接后,它将连接释放回连接池中,并将其标记为“空闲”。连接池会管理连接的状态,确保只有空闲的连接才会被拿出来使用,避免了频繁地创建和销毁连接,从而提高了应用程序的性能和效率。

二、如何使用MySql连接池

MySql连接池有多种实现方式,其中最常用的是基于Apache Commons DBCP、C3P0和HikariCP的连接池。这些连接池都是开源的,可以在Maven中找到相应的依赖。

使用MySql连接池的基本步骤如下:

1.导入依赖

对于使用Maven的项目,可以在pom.xml文件中添加依赖:

  • Apache Commons DBCP
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
登录后复制
  • C3P0
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.5</version>
</dependency>
登录后复制
  • HikariCP
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.5</version>
</dependency>
登录后复制

2.配置连接池参数

在应用程序的配置文件中,需要配置连接池的参数。具体参数有:

  • 数据库的URL、用户名和密码
  • 最大连接数、最小空闲连接数、初始连接数、连接的最大等待时间、检查空闲连接的频率等。每个连接池都有自己的默认值,根据需求进行调整即可。

3.获取连接

通过连接池可以获取连接。在使用连接之前,需要进行连接判断,确保连接是可用状态。每次使用完连接后,需要将连接释放回连接池中,方便下次使用。

以下是一个基于HikariCP连接池的示例代码:

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost/test");
config.setUsername("user");
config.setPassword("password");
config.setMaximumPoolSize(10);

HikariDataSource dataSource = new HikariDataSource(config);

Connection connection = dataSource.getConnection();

//使用连接
…

connection.close();//释放连接
登录后复制

三、如何优化连接池性能

虽然连接池可以提高应用程序的性能和效率,但也需要一定的调优才能发挥最大的作用。以下是一些优化连接池性能的建议:

1、最大连接数和最小空闲连接数的设置:

这两个参数是连接池性能中较为重要的参数。如果最大连接数设置得过小,可能会导致因并发过高而出现连接无法使用的情况,从而造成性能问题。如果最小空闲连接数设置得过大,可能会浪费宝貴的服务器资源,也会对性能造成负面影响。因此,它们的设置需要根据并发量和服务器硬件来确定。

2、连接的最大等待时间:

当连接池中没有空闲的连接时,应用程序的请求会被阻塞等待可用的连接。如果等待时间过长,可能会导致连接超时,从而出现连接异常的情况。因此,连接的最大等待时间需要根据应用程序的性能要求和硬件资源来调整。

3、连接池的检查空闲连接的频率:

连接池中的连接有可能因为服务器宕机、网络故障等原因而失效。为了确保连接池中的连接都是可用的,需要定期检查空闲连接的有效性。检查的频率需要根据应用程序的并发量和硬件资源来调整。

4、使用高性能的连接池:

连接池的性能受很多因素的影响,如连接池的实现方式、数据库的处理能力等。使用性能更高的连接池,可以提高应用程序的性能和效率。

总结:

MySql连接池是优化数据库性能和提高应用程序效率的重要手段,但需要根据应用程序的性能要求、硬件环境等因素来进行调整。通过合理的参数设置和优化,可以发挥连接池的最大性能,提升应用程序的运行效率。

以上就是MySql的连接池:如何提高性能的详细内容,更多请关注php中文网其它相关文章!

MySQL连接被重置,如何通过连接回收和空闲超时来优化连接池的性能?

MySQL连接被重置,如何通过连接回收和空闲超时来优化连接池的性能?

mysql连接被重置,如何通过连接回收和空闲超时来优化连接池的性能?

在开发和维护一个高性能的应用程序时,数据库连接池的优化是非常重要的一环。MySQL是一个常用的关系型数据库,而连接池则是管理与数据库之间连接的重要机制。然而,在连接池中,有时会发生连接被重置的情况,这可能导致应用程序的性能下降。为了解决这个问题并提高连接池的性能,可以考虑使用连接回收和空闲超时技术。

连接回收是指当连接被重置或者发生错误时,将这些连接从连接池中移除,并创建一个新的连接以保持连接的可用性。通过连接回收,可以有效地解决连接被重置的问题,并提高连接池的稳定性和可用性。为了实现连接回收,可以通过在连接池的配置中设置合适的连接回收策略,例如设定一个超时的时间,当连接在这个时间内没有活动时,则将其从连接池中移除并创建一个新的连接。

另外,空闲超时是指当连接长时间空闲时,会被判定为无效连接并从连接池中移除。这是因为长时间空闲的连接可能已经失效或者被数据库服务器关闭了。通过设置合理的空闲超时时间,可以及时回收无效的连接,避免资源的浪费和连接的积压。在连接池的配置中,可以设置连接的最大空闲时间,当连接的空闲时间超过这个阈值时,会被认为是无效连接并移除。

连接回收和空闲超时两种技术的结合使用能够有效提高连接池的性能。当连接被重置或者发生错误时,连接回收保证了连接的及时可用性,避免了应用程序的中断。而通过空闲超时的设置,能够及时回收无效的连接,避免了连接的积压和资源的浪费。

除了连接回收和空闲超时的优化,还有其他一些连接池的性能调优技巧。比如,可以根据应用程序的负载情况来调整连接池的大小,以满足应用程序对数据库连接的需求。另外,可以设置连接池的最大连接数和最小空闲连接数来控制连接的数量,避免过多或过少的连接导致性能问题。此外,还可以使用连接池的预热机制,提前创建连接并放入连接池中,以减少连接的创建和销毁带来的开销。

总之,通过连接回收和空闲超时的优化,可以提高MySQL连接池的性能和稳定性。连接回收保证了连接的及时可用性,避免了连接被重置的问题;而空闲超时则能够及时回收无效的连接,避免了连接的积压和资源的浪费。在实际应用中,还可以结合其他连接池的性能调优技巧,以进一步提升数据库连接的效率。

以上就是MySQL连接被重置,如何通过连接回收和空闲超时来优化连接池的性能?的详细内容,更多请关注php中文网其它相关文章!

MySQL连接被重置,如何通过连接复用来提高连接池的利用率?

MySQL连接被重置,如何通过连接复用来提高连接池的利用率?

mysql连接被重置,如何通过连接复用来提高连接池的利用率?

在应用程序与MySQL数据库之间建立连接是很常见的操作。然而,每次建立和关闭连接都需要耗费一定的资源,而且频繁地建立和关闭连接会对数据库的性能产生负面影响。为了提高连接的利用率,许多应用程序采用连接池技术。连接池可以避免频繁的连接建立和关闭操作,从而提高应用程序与数据库的性能。

然而,在使用连接池的过程中,经常会遇到MySQL连接被重置的问题。当连接被重置时,应用程序就需要重新建立一个新的连接,这会增加额外的开销和延迟。为了解决这个问题,可以通过连接复用来提高连接池的利用率。

连接复用是指在连接池中,当一个连接被释放后,不直接关闭它,而是将其放回到池中,以便下次再利用。这样做的好处是避免了频繁的连接建立和关闭操作,提高了连接的利用率。

要实现连接复用,可以采取以下几个步骤:

  1. 在连接池中维护一个可重用连接的集合。当连接被释放时,将其放入集合中。
  2. 当需要建立连接时,首先从可重用连接的集合中查找是否有可用的连接。如果有,直接使用该连接,而不需要重新建立连接。
  3. 如果没有可用的连接,再根据连接池的配置,判断是否需要建立新的连接。如果需要,就建立新的连接。如果不需要,可以使用其他策略,如等待一段时间,再重新尝试获取连接。
  4. 当连接不再使用时,将其放回连接池中,以便下次重用。

通过连接复用可以减少频繁的连接建立和关闭操作,提高连接池的利用率。但同时也需要考虑一些问题:

  1. 连接的有效性检测:在将连接放入连接池之前,需要对连接进行有效性检测,以确保连接仍然可用。可以通过发送一个简单的SQL查询来检测连接的有效性。
  2. 连接的超时处理:如果连接在一段时间内没有被使用,应该从连接池中移除,以免占用过多的资源。可以通过设置连接的最大空闲时间来控制连接的超时处理。
  3. 连接的最大数量:连接池应该设置最大连接数,以避免过多的连接占用过多的资源。可以根据应用程序的需求和数据库的负载来动态调整最大连接数。

通过连接复用来提高连接池的利用率,可以有效地减少连接建立和关闭的开销,提高应用程序与数据库的性能和效率。合理配置连接池参数,并且注意连接的有效性检测和超时处理,可以更好地利用连接池的优势,提高系统的稳定性和可靠性。

以上就是MySQL连接被重置,如何通过连接复用来提高连接池的利用率?的详细内容,更多请关注php中文网其它相关文章!

关于如何在MySQL中通过连接提高性能的顺序的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于MySQL中复合索引中列的顺序对性能的影响、MySql的连接池:如何提高性能、MySQL连接被重置,如何通过连接回收和空闲超时来优化连接池的性能?、MySQL连接被重置,如何通过连接复用来提高连接池的利用率?等相关内容,可以在本站寻找。

本文标签: