我有一个大表,有670k行,我正在运行一个SELECT,它有很多地方可以搜索和过滤有用的结果,问题是有时所选的过滤器没有结果,而这个查询只是遍历整个表,花费了很多时间,如果在30秒内找不到结果的话,我想停止查询。
这是我的疑问:
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 | | +-----------+--------------+------+-----+---------+----------------+
我在日期、标题、源、数字以及链接上的主键上设置了索引
发布于 2014-11-20 20:43:26
在MySQL中,670k行应该运行得非常快。你应该仔细看看你的指数。开始在news_links.source和news_links.matches上添加一个组合的news_links.matches索引
ALTER TABLE news_links ADD INDEX myIdx1 USING HASH (source, matches)EXPLAIN SELECT ...给你提供了什么?
在此之后,您可以通过在索引中包含更多信息来进一步提高性能(注意,MySQL每个表只使用一个索引)。添加一个BTREE索引:
ALTER TABLE news_links ADD INDEX myIdx2 USING BTREE (source, matches, `date`)BTREE将适合于范围查询(如其中有一个BETWEEN )。HASH对于相等/不平等的条件是好的。如果要索引几个具有混合条件的列(范围为等于),请使用BTREE
EXPLAIN SELECT ...现在给了你什么?
https://stackoverflow.com/questions/27048095
复制相似问题