我是否需要为MySQL单独创建索引?

时间:2010-06-21 11:04:54

标签: php mysql

我遇到了MySQL数据库的一些问题。实际上当我在My localhost上进行测试时速度很快。但是当我上传到公共服务器时它很慢。数据显示但比平常花费更多时间。有7个表打开以读取单个页面。所以我做的是第一个表我添加了用户名和密码。对于最后一个表,我使用mysql_close($db);命令关闭数据库。

这是正确的方法吗?我在数据库方面经验不多。我使用简单的方法来调用数据。

$db = mysql_connect("localhost", "username", "password") or die("Could not connect.");
mysql_select_db("database",$db)or die(mysql_error()); 
$result = mysql_query("SELECT * FROM table WHERE web='$data'")or die(mysql_error());
$row = mysql_fetch_array($result);
$daysA = $row['regtime'];
$days = (strtotime(date("Y-m-d")) - strtotime($row['regtime'])) / (60 * 60 * 24);
if($row > 0 && $days < 7){
   $data = $row['data'];
   $data1 = $row['data1'];
   $data2 = $row['data2'];
   $data3 = $row['data3'];
   $data4 = $row['data4'];
}else{ 

//some function to fill database }

然后在第7个表的末尾,我添加了数据库关闭mysql_close($db);

请帮忙

3 个答案:

答案 0 :(得分:5)

不确定我是否完全理解您的问题,但这里有两个考虑SQL查询的一般建议:

  • 当在条件(即where子句)中使用列时,通常最好在其上放置一个索引:它通常会允许MySQL找到那些行匹配where子句而不必扫描整个表。
  • 如果您使用的是7个查询,那么您是否无法减少查询次数?
    • 解决方案通常是在表之间使用一些连接。
    • 另一种可能是添加一些缓存机制


以下是MySQL手册的几个部分,可能对您有用:


作为旁注:确保在SQL查询中注入之前正确转义$data,以避免SQL Injections; - )

答案 1 :(得分:0)

您在“网络”列上有索引吗?

mysql_close完全没有关系,如果忘了,PHP会在脚本末尾自动调用该函数。

答案 2 :(得分:0)

您可以使用的另一个优化是将日期计算移动到查询中:

$days = (strtotime(date("Y-m-d")) - strtotime($row['regtime'])) / (60 * 60 * 24);

你强迫服务器在这里执行双重任务:MySQL必须将'regtime'日期/时间字段从其内部格式转换为字符串,然后将该字符串转换回PHP时间值(只是一个整数)。 MySQL完全能够自己执行date/time calculations,并且可以避免双重转换开销。

评论后续:

看看那段PHP代码,它归结为:

date('Y-m-d') - 由于没有提供时间参数,因此默认为今天的时间戳(1277186400),并生成2010-06-22   strtotime('2010-06-22') - 将BACK转换为unix时间戳,1277186400

然后

strtotime($row['regtime']) - 将存储在regtime字段中的任何日期的字符串表示形式转换为unix时间戳。让我们说regtime是2009-12-24(嘿,这又是圣诞节了!),所以strtotime返回1261634400

所以你最终得到:

$days = (1277186400 - 1261634400) / (60 * 60 * 24)
$days = 180; // 180 days between Christmas and today

所以,在MySQL方面(假设regtime字段至少是'date'字段,或datetime / timestamp:

SELECT (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(regtime)) / (60 * 60 * 24) AS days
FROM ...

或者,因为您正在使用几天作为间隔:

SELECT TO_DAYS(now()) - TO_DAYS(regtime) AS days
FROM ...