使用单个sql查询优化我的sql代码

时间:2014-04-22 15:33:48

标签: php mysql sql

我有以下表格


-- Table  `user`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `user` ;

CREATE TABLE IF NOT EXISTS `user` (
  `uid` BIGINT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20) NULL,
  `password` VARCHAR(250) NULL,
  `name` VARCHAR(45) NULL
  PRIMARY KEY (`uid`),
  UNIQUE INDEX `username_UNIQUE` (`username` ASC))
ENGINE = InnoDB;
------------------------------------------
Table `post`
------------------------------------------
DROP TABLE IF EXISTS `post` ;
CREATE TABLE IF NOT EXISTS `post` (
`pid` BIGINT NOT NULL AUTO_INCREMENT,
  `body` TEXT NULL,
  `by_uid` BIGINT NOT NULL,
  PRIMARY KEY (`pid`),
) ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `like_post`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `like_post` ;
CREATE TABLE IF NOT EXISTS `like_post` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `post_pid` BIGINT NOT NULL,
  `liked_by` BIGINT NULL,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `favourite_post`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `favourite_post` ;
CREATE TABLE IF NOT EXISTS `favourite_post` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `post_pid` BIGINT NOT NULL,
  `favourite_by` BIGINT NULL,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;

表格数据 用户:

uid username    password    name
1   user1       pass1       User1 Name
2   user2       pass2       user2 name

发表:

Pid body            by_uid
1   This my body text   1
2   This is my body text2   2
3   This is my body text 3  1

关于like_post的数据:

Id  post_id         liked_by
1   1       2   //post id=1 liked by user=2
2   1       1   //post id=1 like by user=1

关于Favourite_post的数据

Id  post_id     favourite_by
1   1       1   //post id=1 favourited by user=1
2   2       1   //post id=2 favourited by user=1

我试图使用单个字符串的sql进行查询,因为它在多个sql查询中做得很好。 我有一个帖子区域,我可以通过使用PDO执行来显示它 PHP代码显示帖子和喜欢的喜欢等

<?php
DBCon Class has the PDO Connection parameters
function selectQuery($str){
    $c=new DBCon();
    $con=$c->conN();
    $stmt=$con->prepare($str);
    $stmt->execute();
    $row=$stmt->fetch();
    return $row;
}
function selectQueries($str){
    $c=new DBCon();
    $con=$c->conN();
    $stmt=$con->prepare($str);
    $stmt->execute();
    $rows=$stmt->fetchAll();
    return $rows;
}

$strPosts=”SELECT * FROM post”;
$rows=selectQueries($strPosts);
foreach($rows as $row){
    $pid=$row[‘pid’];
    echo $row[‘body’];
    $strLike=”SELECT * FROM like where post_pid=”.$pid.” LIMIT 1”;
    $rowLike=selectQuery($strLike);
    echo $rowLike[‘liked_by’];
    $strFav=”SELECT * FROM favourite WHERE post_pid=”.$pid.” LIMIT 1”;
    $rowFav=selectQuery($strFav);
    echo $rowFav[‘favourite_by’];
}
?>

此代码工作正常,而我的帖子数量非常少,但如果帖子数量很大,这将使我的网页速度变慢。那么如何通过在SQL Query中使用单个代码来优化它,这样我就可以获得所有的帖子值,比如值和喜欢的值。

1 个答案:

答案 0 :(得分:0)

解决方案不一定要使用单个查询(尽管这可能会使您作为开发人员的生活更轻松)。使其快速运行的方法是建立索引:您加入的列应具有索引。

以下是一个例子:

SELECT *
FROM User u
    JOIN Post p ON p.by_uid=u.uid

这个简单的示例将获取所有用户及其相关帖子。

为了确保有效运行,您需要在Post.by_uid上添加索引 - 这将允许服务器快速找到每个用户的相应帖子。如果没有索引,服务器将必须扫描Post表中User表中每行的每一行,以便检查&amp;查看该by_uid行中的Post值是否与当前User.uid值匹配。