【问题标题】:Simple SQL statement taking too long简单的 SQL 语句耗时过长
【发布时间】:2014-12-21 09:23:28
【问题描述】:

我有一张包含大约 90 万条记录的表格 votes 是一个 INT 字段,其数字介于 NULL-500k 之间 rating 是 0.0 到 10.0 之间的小数

这些查询大约需要 3 秒

select * from movie where genre = 'action' order by rating asc limit 0,2000; 
select * from movie where genre = 'action' order by votes asc limit 0,2000; 

这个永远不会结束

select * from movie where genre ='action' order by votes desc limit 0,2000; 

我尝试在投票中添加索引,但没有任何区别

我很困惑为什么它在对 int 字段进行排序时遇到这么多问题。任何想法为什么?

【问题讨论】:

  • 你把索引放在哪里了?应该在genre
  • 你能告诉我SHOW CREATE TABLE movies;的结果吗另外,你能告诉我EXPLAIN EXTENDED select * from movie where genre = 'action' order by rating asc limit 0,2000; 的结果吗

标签: mysql sql indexing sql-order-by


【解决方案1】:
  • 在此表上创建两个复合索引,看看是否可以提高性能。一个应该在(genre, rating),另一个应该在(genre, votes)。这些复合索引将有助于有效地处理您显示的查询的 WHEREORDER BY 子句。

  • 试试这个查询看看事情是否变得更快:

    select * from movie where genre='action' and votes is not null order by votes desc limit 2000

    这将消除您的 NULL 投票,这可能会混淆您的查询。

  • 不要使用select *;如果您只获取您需要的列,您可能能够获得更快的结果。

  • 重新定义votes 列,使其为NOT NULL,并将默认值设为零。 NULL 值在 WHEREORDER BY 子句中的工作效率不高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多