2015-11-14 54 views
1

我在多年前为我的mysql表格写了这段代码,现在有大量的网站流量,我觉得需要改变和改进它。复杂的MySQL表格架构及其性能

SELECT ns.* 
    FROM stories AS ns 
    WHERE section='news' 
     AND title!='draft' 
     AND ( 
      FIND_IN_SET('4', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('5', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('6', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('7', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('8', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('9', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('10', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('11', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('12', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('13', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('14', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('15', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('16', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('17', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('18', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('19', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('20', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('21', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('22', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('23', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('24', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('25', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('26', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('27', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('28', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('29', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('30', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('31', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('32', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('33', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('34', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('35', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('36', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('37', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('38', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('39', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('40', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('41', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('42', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('43', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('44', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('45', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('46', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('47', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('48', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('49', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('50', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('51', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('52', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('53', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('54', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('55', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('56', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('57', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('58', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('59', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('60', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('61', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('62', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('63', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('64', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('65', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('66', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('67', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('68', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('69', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('70', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('71', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('72', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('73', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('74', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('75', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('76', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('77', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('78', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('79', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('80', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('81', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('82', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('83', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('84', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('85', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('86', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('87', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('88', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('89', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('90', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('91', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('92', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('94', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('95', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('96', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('97', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('98', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('99', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('100', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('101', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('102', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('103', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('104', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('105', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('106', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('107', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('108', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('109', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('110', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('111', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('112', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('113', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('114', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('115', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('116', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('117', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('118', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('119', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('120', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('121', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('122', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('123', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('125', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('126', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('127', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('128', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('129', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('130', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('131', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('132', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('133', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('134', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('135', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('136', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('137', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('138', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('139', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('140', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('141', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('142', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('144', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('145', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('146', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('147', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('148', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('149', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('150', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('151', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('152', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('153', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('154', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('155', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('156', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('157', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('158', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('159', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('160', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('161', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('162', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('163', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('164', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('165', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('166', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('167', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('168', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('169', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('170', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('171', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('172', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('173', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('174', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('175', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('176', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('177', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('178', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('179', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('180', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('181', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('182', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('183', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('184', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('185', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('186', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('187', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('188', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('189', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('190', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('191', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('192', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('193', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('194', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('195', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('196', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('197', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('198', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('199', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('200', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('201', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('202', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('203', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('204', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('206', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('207', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('208', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('209', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('210', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('211', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('212', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('213', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('214', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('215', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('216', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('217', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('218', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('219', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('220', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('221', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('222', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('223', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('224', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('225', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('226', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('227', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('228', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('229', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('230', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('231', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('232', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('233', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('234', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('235', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('236', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('237', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('238', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('239', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('240', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('241', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('242', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('243', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('244', REPLACE(jjob, '-', ',')) 
     OR FIND_IN_SET('245', REPLACE(jjob, '-', ',')) 
    ) AND time <= '2015-11-14 08:30:59' 
    ORDER BY ns.hotnews DESC,ns.sid DESC 

这里是我的表结构:

CREATE TABLE IF NOT EXISTS `stories` (
    `sid` int(11) NOT NULL, 
    `catid` int(11) NOT NULL DEFAULT '0', 
    `aid` varchar(30) COLLATE utf8_bin NOT NULL, 
    `title` text COLLATE utf8_bin, 
    `time` datetime DEFAULT NULL, 
    `hometext` text COLLATE utf8_bin, 
    `bodytext` text COLLATE utf8_bin NOT NULL, 
    `hotnews` int(1) NOT NULL DEFAULT '0', 
    `tags` varchar(255) COLLATE utf8_bin NOT NULL, 
    `approved` tinyint(1) NOT NULL DEFAULT '1', 
    `section` varchar(15) COLLATE utf8_bin NOT NULL DEFAULT 'news', 
    `rate` int(8) NOT NULL DEFAULT '0', 
    `rates_count` int(8) NOT NULL DEFAULT '0', 
    `jorganization` int(1) NOT NULL DEFAULT '0', 
    `jemployment` int(1) NOT NULL DEFAULT '0', 
    `jsex` int(1) NOT NULL DEFAULT '0', 
    `jagelimit` int(1) NOT NULL DEFAULT '0', 
    `jmarriage` int(1) NOT NULL DEFAULT '0', 
    `jduty` int(1) NOT NULL DEFAULT '0', 
    `jedu` int(1) NOT NULL DEFAULT '0', 
    `jmajor` int(1) NOT NULL DEFAULT '0', 
    `jfield` text COLLATE utf8_bin NOT NULL, 
    `jjob` text COLLATE utf8_bin NOT NULL, 
    `jcity` text COLLATE utf8_bin NOT NULL 
) ENGINE=MyISAM AUTO_INCREMENT=71693 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

-- 
-- Indexes for dumped tables 
-- 

-- 
-- Indexes for table `stories` 
-- 
ALTER TABLE `stories` 
    ADD PRIMARY KEY (`sid`), ADD KEY `tags` (`tags`), ADD KEY `rate` (`rate`), ADD KEY `rates_count` (`rates_count`); 

当我运行查询,你可以看到它需要超过2秒:

Showing rows 0 - 24 (27875 total, Query took 2.3042 seconds.) [hotnews: 0 - 0] [sid: 71692 - 71631] 

和解释:

enter image description here

+0

什么是'您的查询的explain'说什么? – user2655603

+0

你想用这个查询做什么,这个例子查询很庞大? –

+0

@JeffK我想让它跑得更快,我认为索引列jjob是一个好主意,但是这个列是一个文本类型,所以我不能索引它。 – Ghazanfari

回答

1

如果你只使用在最大一定数量行的计划恢复,最简单的一个(最有利)要做的事情是增加一个LIMIT

另外是一些简单的事情可以做:

  1. 只选择你需要
  2. 领域添加覆盖索引(https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/
  3. 修改/重组jjob

    我不是确切地确定jjob正在做什么,但是你可能需要将它分离到另一个表中。例如,也许你有一个单独的jjobs表,并创建一个连接表(stories_jjobs)来保存每个独特的故事/ jjob realtionship。

你可能想尝试是摆脱所有FIND_IN_SETREPLACE和尝试像AND (jjob LIKE %-6% OR jjob LIKE %-9-% etc...)

编辑

在你的结构看更长时间后,你或许应该上述分隔成另一种选择多表,为您的长期利益。您的数据库相当小,因此创建一些查询来移动数据不应该太痛苦。从我可以收集的j列看起来包含人员或用户数据。也许你可以制作个人或用户表,工作表和联结表表格以加入故事和工作?

+0

Jeff认为我无法将jjob更改为像句子,因为没有 - 在第一个id后面,例如23-24- 44-11 – Ghazanfari

+0

@Ghazanfari你可以运行一个快速查询来更新所有的记录,使其有一个开始和结尾的短划线,并修改你的应用程序代码来做同样的事情。 –

+0

让我们说,我们这样做,它有什么不同?它再次与%一样,它仍然是德超过2秒来处理该查询。 – Ghazanfari

1

你有一个糟糕的数据结构。所有这些find_in_set()调用都会​​提示数据结构存在问题。它建议您将jjob作为分隔列表存储。这使数据结构复杂化,并使查询更难以处理。你应该解决这个问题。

此外,您的查询返回27,875行。这可能需要一些时间,取决于行的宽度。所以,2秒可能不会那么糟糕。

与此同时,适当的索引可能会有所帮助。请看下面的索引查询:

stories(section, time, title, jjob) 

这包括where条款,因此可能有一些性能增益。

另一件尝试的是正则表达式。您可以替换所有与find_in_set()电话:

concat('-', jjob, '-') rlike '-4-|-5-| . . .' 

一个正则表达式可能比几十行的,你现在有更快。不过,我必须强调,正确的解决方案是一个叫做StoryJobs的联结表。

+0

为什么'concat(' - ',jjob,' - ')rlike'?不应该只是'jjob rlike ...',而是希望OP请求' - '已经在'jjob'字符串中作为值分隔符。 –

+0

@JuanCarlosOropeza。 。 。您需要最后的分隔符才能正确匹配第一个和最后一个值。 –

0

这种综合指数可能有助于做更多的过滤:

INDEX(section, time) 

您应该切换到InnoDB的。

REPLACE只有一次应该有所帮助:

SELECT 
    FROM 
     (SELECT 
       id, -- I am assuming the `PRIMARY KEY` for `stories` is `id` 
       REPLACE(jjob, '-', ',') AS commas 
      FROM stories 
      WHERE section='news' 
       AND title!='draft' 
       AND time <= '2015-11-14 08:30:59' 
    ) AS x 
    JOIN stories AS ns ON ns.id = x.id 
    WHERE FIND_IN_SET('4', commas) 
     OR FIND_IN_SET('5', commas) 
     OR FIND_IN_SET('6', commas) 
     OR FIND_IN_SET('7', commas) 
     OR ... 
     OR FIND_IN_SET('245', commas) 
    ORDER BY ns.hotnews DESC, ns.sid DESC