0

我有一个 MySQL 问题。我必须优化我网站上的一些查询。其中一个我已经完成了,但仍有一些没有你的帮助我无法解决。

我有一个名为“新闻”的表:

CREATE TABLE IF NOT EXISTS `news` (
  `id` int(10) NOT NULL auto_increment,
  `edited` smallint(1) NOT NULL default '0',
  `site` varchar(30) default NULL,
  `foreign_id` varchar(25) default NULL,
  `title` varchar(255) NOT NULL,
  `text` text NOT NULL,
  `image` varchar(255) default NULL,
  `horizontal` smallint(1) NOT NULL,
  `image_author` varchar(255) default NULL,
  `text_author` varchar(255) default NULL,
  `lang` varchar(3) NOT NULL,
  `link` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `redirect` smallint(1) NOT NULL,
  `parent` int(10) NOT NULL,
  `views` int(5) NOT NULL,
  `status` smallint(1) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `lang` (`lang`,`status`),
  KEY `date` (`date`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=47122 ;

如您所见,我有两个索引:“lang”和“date”

我尝试了一些不同索引的组合,这个组合给我带来了最好的结果……不幸的是,只在我的本地计算机上。在服务器上我仍然有不好的结果。我想说数据库是一样的。

询问:

SELECT id FROM news WHERE lang =  'en' AND STATUS =1 ORDER BY DATE DESC LIMIT 0, 10

本地主机解释:

+----+-------------+--------+-------+-------------- -+--------+---------+------+------+-------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+--------+-------+-------------- -+--------+---------+------+------+-------------+
| 1 | 简单 | 新闻 | 索引 | 朗 | 日期 | 3 | 空 | 23 | 使用位置 |
+----+-------------+--------+-------+-------------- -+--------+---------+------+------+-------------+

服务器说明:

+----+-------------+--------+------+--------------- +--------+---------+-------------+--------+-------- ---------------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+--------+------+--------------- +--------+---------+-------------+--------+-------- ---------------------+
| 1 | 简单 | 新闻 | 参考 | 状态 | 状态 | 13 | 常量,常量 | 15840 | 使用哪里;使用文件排序 |
+----+-------------+--------+------+--------------- +--------+---------+-------------+--------+-------- ---------------------+

我看过很多其他类似的主题,但不幸的是我找不到在我的服务器上工作的任何解决方案。我很高兴为您提供一些解决方案和一些解释,以便我可以优化我的其他查询。

谢谢 !

4

1 回答 1

1

这是您的查询:

SELECT id
FROM news
WHERE lang = 'en' AND STATUS =1
ORDER BY DATE DESC
LIMIT 0, 10

最好的索引是包含查询中使用的所有字段(总共四个字段)的索引。索引中的排序是由子句中的相等条件,然后是子句where,然后是order by子句中的其他列select

所以,试试这个索引: ndws(leng, status, date, id).

于 2013-06-23T13:11:22.353 回答