【发布时间】: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