php - 优化sql语句以降低MySQL服务器负载

标签 php mysql sql mysqli prepared-statement

$sql1 = "SELECT questions FROM last_check_date WHERE user_id=? ORDER BY questions DESC LIMIT 1";
$sql2 = "SELECT id FROM questions WHERE add_dt>?";

上面的语句有什么作用?

当我执行 sql1 时,它获取用户的最后检查日期。

然后我执行第二个查询,以获取所有 id 的添加日期>上次检查日期(来自 sql1)并返回受影响的行数。

我想做的是将这 2 个语句合并为 1 个,并优化查询计数。可能会出现以下问题:

$sql1 中没有用户行:必须选择 sql2 中的所有行并返回受影响的行数。

我不知道它应该是什么样子..提前致谢

更新

SHOW CREATE TABLE last_check_date; 结果是

CREATE TABLE `last_check_date` (
  `id` int(11) unsigned NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  `questions` datetime DEFAULT NULL,
  `users` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

SHOW CREATE TABLE问题;

CREATE TABLE `questions` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `author_id` bigint(20) unsigned DEFAULT NULL,
  `question` text NOT NULL,
  `var_a` text NOT NULL,
  `var_b` text NOT NULL,
  `var_c` text NOT NULL,
  `var_d` text NOT NULL,
  `var_e` text NOT NULL,
  `subject` int(11) unsigned DEFAULT NULL,
  `chapter` int(11) unsigned DEFAULT NULL,
  `section` int(11) unsigned DEFAULT NULL,
  `paragraph` int(11) unsigned DEFAULT NULL,
  `rank` tinyint(2) NOT NULL,
  `add_dt` datetime NOT NULL,
  `answer` varchar(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_chapters-id` (`chapter`),
  KEY `fk_paragraphs-id` (`paragraph`),
  KEY `fk_subjects-id` (`subject`),
  KEY `fk_sections-id` (`section`),
  KEY `fk_author-id` (`author_id`),
  CONSTRAINT `fk_author-id` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_chapters-id` FOREIGN KEY (`chapter`) REFERENCES `chapters` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_paragraphs-id` FOREIGN KEY (`paragraph`) REFERENCES `paragraphs` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_sections-id` FOREIGN KEY (`section`) REFERENCES `sections` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_subjects-id` FOREIGN KEY (`subject`) REFERENCES `subjects` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

最佳答案

$sql = "
    SELECT q.id 
    FROM questions q
    LEFT JOIN (
        SELECT questions 
        FROM last_check_date 
        WHERE user_id=? 
        ORDER BY questions 
        DESC LIMIT 1
    ) l ON q.add_dt > l.questions"

$rs = mysql_query($sql);
$rowcount = mysql_num_rows($rs);

我还不知道 PDO/MYSQLI 的正确语法,请适应您喜欢的驱动程序。

关于php - 优化sql语句以降低MySQL服务器负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10884000/

相关文章:

mysql - sqlite 事务未显示在 test.log 中

php - 如何使用 Pantheon.io 的机器 token 验证终端?我收到 cURL 错误 60 : SSL certificate

php - 检测图像是否损坏或损坏

php - 如何从 3 个表中选择,同时加入另外 2 个表

mysql - 选择带有显示标志但基于另一个表的行

php - 当我只有父级的父级文本时如何获取 TreeView 项目的 id

sql - 简化 If 和 else IF 查询

php - Mysql查询找不到第一个词

javascript - 图片加载失败时显示 fa-icon

mysql - 从每个领域获得总值(value)?