为什么我的查询需要2分钟才能运行?
问题描述:
注 - db中有大约2-3百万条记录。为什么我的查询需要2分钟才能运行?
SELECT
route_date, stop_exception_code, unique_id_no,
customer_reference, stop_name, stop_comment,
branch_id, customer_no, stop_expected_pieces,
datetime_updated, updated_by, route_code
FROM
cops_reporting.distribution_stop_information distribution_stop_information
WHERE
(stop_exception_code <> 'null') AND
(datetime_updated >= { ts '2011-01-25 00:00:01' })
ORDER BY datetime_updated DESC
答
如果你发布你已经在这个表上,或者一个查询执行计划的指标,它会更容易了解。事实上,如果您创建包含stop_exception_code
和datetime_updated
的组合索引,我会猜测您可以提高性能。我不能保证这实际上可行,但它可能值得一试。我不能说远不止这些,没有任何其他信息...
答
一些经验法则:对连接列
- 指数。
- WHERE子句中使用的列的索引。
- '不等于'总是比'等于'条件慢。考虑将表拆分为那些为空和那些不属于这些的表,或者将表拆分为联接表作为索引。
- 使用正确的JOIN语法即是明确在哪里连接是通过写INNER JOIN速度东西在某些数据库(我见过一个10分钟+查询只是单是这种变化踏踏实实地在MySQL 30秒)
- 使用别名每个表和前缀,每列
- 店作为一个函数/过程,它会预编译,并得到更快
答
stop_exception_code <> 'null'
请告诉我,“空”是不是引入你的数据库。标准SQL将
stop_exception_code IS NOT NULL
或
stop_exception_code is NULL
我不知道什么是NULL stop_exception_code可能对你意味着什么。但是如果它的意思是“我不知道”,那么为“我不知道”使用特定值可能会让您的服务器在该列上使用索引,并将它索引为可能无法用于NULL 。 (或者,也许你已经通过使用字符串'null'来做到这一点)。
没有看到你的DDL,实际查询和执行计划,这些都是我可以告诉你的。
什么数据库引擎? – Blorgbeard 2011-01-27 16:59:55
您需要添加更多关于模式和相关索引的信息。例如 - datetime_updated上有一个索引,它是什么类型的索引?连接列上是否有索引? – iain 2011-01-27 17:01:22