我正在尝试优化具有220,000行的相对较大的mysql(myisam)表。桌子本身不是很大-大约23.5MB。那么,真正的问题是什么?-我得到这样的查询:
SELECT * FROM table WHERE DATE_FORMAT(date_field, '%m%d') = '1128' LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我试图在date_field上设置一个索引,但EXPLAIN显示该索引根本没有使用...我猜这并不奇怪,因为DATE_FORMAT()。因此,我计划添加另一列,将日期保留为'%m%d'并在其上放置一个索引。我不想这样做的唯一原因是因为数据重复。
顺便说一句,我使用date_field是生日日期字段,并且我确定我总是需要date_field为%Y-%m-%d或只是%m%d
您是否对上面的查询如何优化有更好的建议?提前致谢 !!!
一些信息:
MySQL版本:5.0.51b-log
操作系统:slackware 12.1
CPU:Pentium III(Coppermine)at 996.783Mhz
RAM:512MB DDR
HDD:80GB SATA
PS我试图添加另一列,将日期保存为%m%d。结果非常好,但我仍然不喜欢这种方法。我正在等待更多建议!
ob_*当它作为cronjob运行时,我遇到了一些函数问题:
<?php
function getLayout($file, $extract=array()) {
if (is_file($file)) {
if (count($extract) > 0) {
extract($extract);
}
ob_start();
include $file;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}
file_put_contents('somecachefile.html', getLayout('somefile.php', array('var1'=>$val1, 'var2'=>$val2)));
?>
Run Code Online (Sandbox Code Playgroud)
cronjob设置如下:(每分钟运行)
* * * * * /usr/bin/php /path/to/cron.php > /dev/null
Run Code Online (Sandbox Code Playgroud)
在这种情况下,没有任何事情发生,但cron真的跑了.
如果我/usr/bin/php /path/to/cron.php从命令行调用this(),一切都按预期工作.
我犯了什么错误的想法?
感谢您的帮助!
我收到了这个问题:
SELECT user_id
FROM basic_info
WHERE age BETWEEN 18 AND 22 AND gender = 0
ORDER BY rating
LIMIT 50
Run Code Online (Sandbox Code Playgroud)
该表看起来像(它包含大约700k行):
CREATE TABLE IF NOT EXISTS `basic_info` (
`user_id` mediumint(8) unsigned NOT NULL auto_increment,
`gender` tinyint(1) unsigned NOT NULL default '0',
`age` tinyint(2) unsigned NOT NULL default '0',
`rating` smallint(5) unsigned NOT NULL default '0',
PRIMARY KEY (`user_id`),
KEY `tmp` (`gender`,`rating`),
) ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)
查询本身已经过优化,但它必须走大约20万行来完成他的工作.这是解释输出:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE basic_info ref tmp,age tmp …Run Code Online (Sandbox Code Playgroud)