【问题标题】:MySql Triggers and performanceMySql 触发器和性能
【发布时间】:2014-06-06 04:55:02
【问题描述】:

我有以下要求。我有 4 个 MySQL 数据库和一个应用程序,用户需要在其中获取每个数据库的表中的记录数。问题是计数可能每分钟或每秒都在变化。因此,每当用户将鼠标悬停在特定的 UI 区域时,我都需要调用所有这些数据库并获取计数。我认为这不是最好的方法,因为这些表包含数百万条记录,每次鼠标悬停时,都会对所有这些数据库进行一次 dB 调用。

触发器是我发现的一种方法。而不是我们从数据库中提取数据,我觉得每当这些表发生任何插入/更新/删除时,都会执行一个触发器,这将增加/减少另一个表中的计数(仅包含这些表的计数) .但是我看过好像触发器会影响数据库性能,也看过一些情况触发器是唯一的解决办法。

所以请指导我在我的情况下触发器是解决方案吗?如果它影响数据库性能,我不需要它。有没有其他更好的方法来解决这个问题?

谢谢

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    我的理解是,您有 4 个数据库,每个数据库中有 n 个表,当用户将鼠标悬停在应用程序中的特定区域时,用户应该会看到该表中的行数。 我建议您使用 count(*) 来返回数据库中每个表中的行数。触发器用于在数据库中发生特定事件(如更新、删除或插入)时执行某些操作。这不是一个好主意调用触发器以对悬停等用户交互做出反应。如果您能告诉我您正在使用哪种语言设计前端,我可以更具体一些。

    例子:

    SELECT COUNT(*) FROM tablename where condition
    

    SELECT SQL_CALC_FOUND_ROWS * FROM tablename
       WHERE condition 
       LIMIT 5;
    
    SELECT FOUND_ROWS();
    

    当您想要限制结果但仍返回找到的总行数时使用第二个。希望它有所帮助。

    【讨论】:

    • 感谢您的回复。您给出的解决方案是直截了当的。但我担心性能,我要问的是每次鼠标悬停,我将这个 count(*) 查询写入我的数据库不是一个好的选择。该数据库包含大量记录,并且还用于其他一些应用程序。我的方法是向这些表写入触发器,然后将计数保存在另一个表中(仅由我的应用程序使用的表)。这样我就可以轻松获取计数。但我要问的是写触发器是不是一个不错的选择
    【解决方案2】:

    请不要使用 count(*)。这是低效的,可能会导致表扫描。如果您可以访问信息架构,这应该会返回您需要亚秒级的结果:

    select table_rows from information_schema.tables where table_name = 'tablename'
    

    如果由于某种原因不能,并且您的表有主键,请尝试:

    SELECT COUNT(field) FROM tablename
    

    ...其中字段是主键的一部分。这会慢一些,尤其是在大表上,但仍然比 count(*) 好。

    绝对不要使用触发器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多