Mysql高效的查询(select和update)


mysql effecient query (select and update)

我有一个表,它的结构如下:

`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.p php相同:

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

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

第二种方法可能是创建包含'visit'的新表,如下所示:

'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命令)运行。另外,我需要其他页面上的其他查询的第一个表索引。

我认为你的第一种方法是最好的,也是最简单的。更新访问将非常快,不需要执行索引更新。

我更喜欢前者,并且在过去类似的事情中使用过,没有任何问题。您可以删除限制子句,因为id是主键,因此不会有超过1个结果,尽管查询优化器可能会为您完成此操作。

之前有人问了一个问题,我给出了一个您可能也会考虑的解决方案。当你"计数"列时,你就失去了以后挖掘数据的能力。使用事务表,您不仅可以获得"视图"计数,还可以查询日期范围等。当然,您将承担存储数十万行数据的重担,但是表很窄,索引是数字的。

我无法在数据库端看到解决方案…也许您可以用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;
}

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