Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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数据库的增长,我有哪些选择_Mysql_Performance - Fatal编程技术网

随着mysql数据库的增长,我有哪些选择

随着mysql数据库的增长,我有哪些选择,mysql,performance,Mysql,Performance,如何改进此查询? 请告诉我这里的所有选择,因为我的社交网络数据库只会越来越大 此查询耗时2.1231秒 SELECT friend_friend.friendid, friend_reg_user.disp_name, friend_reg_user.pic_url, friend_reg_user.online FROM friend_friend INNER JOIN friend_reg_user ON friend_friend.friendid = friend_reg_user.au

如何改进此查询? 请告诉我这里的所有选择,因为我的社交网络数据库只会越来越大

此查询耗时2.1231秒

SELECT friend_friend.friendid, friend_reg_user.disp_name, friend_reg_user.pic_url, friend_reg_user.online
FROM friend_friend
INNER JOIN friend_reg_user ON friend_friend.friendid = friend_reg_user.auto_id
WHERE userid =1
AND friend_friend.status =1
ORDER BY autoid DESC 
LIMIT 59535 , 15


#####################################################################################################################################
# id # select_type  # table           # type   # possible_keys  # key     # key_len  # ref                     # rows  # Extra      #
#####################################################################################################################################
#  1 # SIMPLE       # friend_friend   # ref     # userid        # userid  # 5        # const                   # 59843 # Using where#
#  1 # SIMPLE       # friend_reg_user # eq_ref # PRIMARY        # PRIMARY # 4        # friend_friend.friendid  # 1     #            #
#####################################################################################################################################

当这个表有一百万行甚至两百万行大时,我有什么选择?此表用于确定谁是用户朋友

我知道一个程序员正在处理其数据库中的800万条记录,它实际上不会对速度产生太大的影响。它只是创建正确的索引,并确保以有效的方式获取数据。(关系的数字ID非常有用)


而且,您的查询在很大程度上是赤裸裸的。不要太花哨。这可能只是您的服务器延迟。

我认识一位程序员,他正在处理数据库中的800万条记录,而这并不会对速度造成太大影响。它只是创建正确的索引,并确保以有效的方式获取数据。(关系的数字ID非常有用)


而且,您的查询在很大程度上是赤裸裸的。不要太花哨。这可能只是您的服务器延迟。

也许我不太了解您的模式,但您真的需要
左连接吗?您不能使用
内部联接吗

(我经常听说它可能更适合表演,因为它返回的行数更少;在你的例子中,如果你想要一个人的朋友,我不认为左连接有什么意义:朋友将被“链接”,因此,在“链接”表中有一个条目,不是吗?)

此外,请确保所用字段上有索引:

  • 在条件中(无论是“何处”或“加入”条件);这里看起来还好吗
  • 用于分类;autoid有索引吗
MySQL在某些应用程序中与非常大的表一起使用,如果索引/配置正常,则可以非常快速地响应;因此,这里确实有一些我们应该能够做的事情;-)


作为旁注:几乎所有字段的名称都以表的名称作为前缀(我想是因为字段的名称重复);你为什么不总是那样做呢?这将使查询更容易理解;-)

也许我不太理解你的模式,但是你真的需要一个
左连接吗?您不能使用
内部联接吗

(我经常听说它可能更适合表演,因为它返回的行数更少;在你的例子中,如果你想要一个人的朋友,我不认为左连接有什么意义:朋友将被“链接”,因此,在“链接”表中有一个条目,不是吗?)

此外,请确保所用字段上有索引:

  • 在条件中(无论是“何处”或“加入”条件);这里看起来还好吗
  • 用于分类;autoid有索引吗
MySQL在某些应用程序中与非常大的表一起使用,如果索引/配置正常,则可以非常快速地响应;因此,这里确实有一些我们应该能够做的事情;-)


作为旁注:几乎所有字段的名称都以表的名称作为前缀(我想是因为字段的名称重复);你为什么不总是那样做呢?这将使查询更容易理解;-)

只要WHERE子句中的列是索引,就可以了。我将生成一组重要的测试数据并运行一些基准测试


此外,更重要的是,要熟悉语法。它将帮助您确定查询中实际使用了多少行(除其他外),并且是优化查询和表索引的一个很好的工具。

只要WHERE子句中的列是索引,就可以了。我将生成一组重要的测试数据并运行一些基准测试


此外,更重要的是,要熟悉语法。它将帮助您确定查询中实际使用了多少行(除其他外),并且是优化查询和表索引的一个很好的工具。

您应该找出导致查询速度缓慢的原因

你的数据库适合内存吗?如果没有,那就多买些——不,真的。不管你怎么看,光碟都很慢

如果您的查询必须使用disc(比如说您的数据库太大,无法提供合理的内存,比如100G以上),那么您应该尽量减少所需的IO操作数量

实际上,这意味着一定程度的非规范化(您真的需要联接吗?您不能在外部参照表上存储(拷贝)所有需要的字段吗?),以及明智地使用覆盖索引

在InnoDB中(我假设您在这里使用InnoDB),主键是集群的。这意味着使用主键的查询比其他索引执行的IO更少(因为索引与数据存储在同一页中),因为它们不需要为每一行执行可能单独的IO,而这通常是辅助索引所需要的

基本原则是:

  • 在非生产环境中,使用生产规格硬件上的生产级数据重现问题
  • 诊断是什么引起的
  • 做一个你认为可以解决它的改变
  • 使用相同的生产规范非生产环境再次测量,以验证修复程序的性能
  • 重复上述步骤,直到您有足够的性能来解决问题(安抚客户等)
  • 如果成功,那么您可以执行任何正常的QA程序(例如回归测试等)来发布更改


    在某些情况下,更改将需要进行重大的数据迁移,因此部署起来非常麻烦(例如,您需要更改10Tb数据表的架构)。

    您应该找出是什么原因导致其速度变慢

    你的数据库适合内存吗?如果没有,那就多买些——不,真的。不管你怎么看,光碟都很慢

    如果您的查询必须使用disc(比如说您的数据库太大了)