首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当没有足够的结果时,MySQL按时间限制查询

当没有足够的结果时,MySQL按时间限制查询
EN

Stack Overflow用户
提问于 2014-11-20 19:41:36
回答 1查看 126关注 0票数 0

我有一个大表,有670k行,我正在运行一个SELECT,它有很多地方可以搜索和过滤有用的结果,问题是有时所选的过滤器没有结果,而这个查询只是遍历整个表,花费了很多时间,如果在30秒内找不到结果的话,我想停止查询。

这是我的疑问:

代码语言:javascript
复制
SELECT date, s.name, l.id, l.title,ratingsum,numvotes,keyword,tag 
from news_links l
LEFT JOIN sources s on s.id = l.source
WHERE
    l.date BETWEEN STR_TO_DATE(?,'%Y-%m-%d') 
    AND STR_TO_DATE(?,'%Y-%m-%d')
    AND s.name like ?
    AND ((numvotes-1) *?) <= l.ratingsum
    AND numvotes > ?
    AND matches = 1
    AND tag >= ? 
    AND tag <= ?
    AND (l.title like ? or l.keyword like ?)
    AND category >= ? 
    AND category <= ?
order by date desc
limit ?,15

我试着运行一个子查询,而不是加入,但它并没有加快查询速度。

新闻表格(640 k行) -----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | UNI | NULL | auto_increment | | link | varchar(450) | NO | PRI | NULL | | | date | datetime | NO | MUL | NULL | | | title | varchar(145) | NO | MUL | NULL | | | source | int(11) | NO | MUL | NULL | | | text | mediumtext | YES | | NULL | | | numvotes | int(3) | NO | MUL | 0 | | | ratingsum | int(3) | NO | | 0 | | | matches | int(1) | NO | | 0 | | | keyword | varchar(45) | YES | | NULL | | | tag | int(1) | NO | | 0 | | +-----------+--------------+------+-----+---------+----------------+

我在日期、标题、源、数字以及链接上的主键上设置了索引

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 20:43:26

在MySQL中,670k行应该运行得非常快。你应该仔细看看你的指数。开始在news_links.sourcenews_links.matches上添加一个组合的news_links.matches索引

代码语言:javascript
复制
ALTER TABLE news_links ADD INDEX myIdx1 USING HASH (source, matches)

EXPLAIN SELECT ...给你提供了什么?

在此之后,您可以通过在索引中包含更多信息来进一步提高性能(注意,MySQL每个表只使用一个索引)。添加一个BTREE索引:

代码语言:javascript
复制
ALTER TABLE news_links ADD INDEX myIdx2 USING BTREE (source, matches, `date`)

BTREE将适合于范围查询(如其中有一个BETWEEN )。HASH对于相等/不平等的条件是好的。如果要索引几个具有混合条件的列(范围为等于),请使用BTREE

EXPLAIN SELECT ...现在给了你什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27048095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档