【问题标题】:mysql effecient query (select and update)mysql 高效查询(选择和更新)
【发布时间】:2011-11-04 21:12:09
【问题描述】:

我有一张表,其结构如下:

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ttype` int(1) DEFAULT '19',
`title` mediumtext,
`tcode` char(2) DEFAULT NULL,
`tdate` int(11) DEFAULT NULL,
`visit` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `tcode` (`tcode`),
KEY `ttype` (`ttype`),
KEY `tdate` (`tdate`)


ENGINE=MyISAM 

我在 x.php 上有两个查询,如下所示:

SELECT * FROM table_name WHERE id='10' LIMIT 1
UPDATE  table_name SET visit=visit+1 WHERE id='10' LIMIT 1

我的第一个问题是更新表中的“访问”是否会导致重新索引和降低性能?请注意,“访问”不是关键。

第二种方法可能是创建包含“访问”的新表,如下所示:

'newid' int(10)  unsigned NOT NULL ,
`visit` int(11) DEFAULT '0',
 PRIMARY KEY (`newid`),

     ENGINE=MyISAM 

所以选择

SELECT w.*,q.visit FROM table_name w  LEFT JOIN table_name2 q 
ON (w.id=q.newid) WHERE w.id='10' LIMIT 1 

    UPDATE  table_name2 SET visit=visit+1 WHERE newid='10' LIMIT 1

第二种方法是否优先于第一种方法?哪一个性能更好,速度更快?

注意:所有 sql 查询都将由 PHP(mysql_query 命令)运行。我还需要其他页面上的其他查询的第一个表索引。

【问题讨论】:

  • 如果一个字段被索引并且您更改了记录中该字段的内容,则必须更新索引。有不可避免的。但是,如果该字段未在 JOIN 或 WHERE 子句中使用,则很可能不需要索引。

标签: php mysql sql optimization query-optimization


【解决方案1】:

我会说你的第一种方法是最好的,也是最简单的。更新访问会很快,不需要更新索引。

我更喜欢第一个,并且过去曾将其用于类似的事情,没有任何问题。您可以删除限制子句,因为 id 是您的主键,您永远不会有超过 1 个结果,尽管查询优化器可能会为您执行此操作。

【讨论】:

    【解决方案2】:

    有人问了earlier 的一个问题,我回答了一个您可能也想考虑的解决方案。当您对列进行“计数”时,您将失去以后挖掘数据的能力。使用事务表,您不仅可以获得“查看次数”计数,还可以查询日期范围等。当然,您将承担存储可能数十万行的重任,但该表很窄并且索引是数字的。

    【讨论】:

      【解决方案3】:

      我在数据库方面看不到解决方案...也许您可以在 PHP 中做到这一点:如果用户有一个 PHP 会话,例如,您可以仅每 10 次更新访问者计数,例如:

      <?php
      session_start();
      $_SESSION['count']+=1;
      if ($_SESSION['count'] > 10) {
        do_the_function_that_updates_the_count_plus_10();
        $_SESSION['count'] = 0;
      
      }
      

      这样你当然会丢失一些计数,但也许这不是那么重要?

      【讨论】:

      • 他可能正在数据库中执行此操作 b/c 他希望这些值在多个会话中持续存在。
      • 正是@Digital-Precision 我希望这些值在多个会话中保持不变。
      猜你喜欢
      • 1970-01-01
      • 2016-01-16
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2013-11-13
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多