2

我创建了一个复杂的视图,它在一秒钟内给我在 Oracle 10g DBMS 上的输出。但在 MYSQL DBMS 上,相同的视图需要 2.3 分钟。我已经在视图定义中包含的所有字段上创建了索引,并且增加了query_cache_size但仍然未能在更短的时间内得到答案。我的查询如下

select * from results where beltno<1000; 

而我的观点是:

create view results as select person_biodata.*,current_rank.*,current_posting.* from person_biodata,current_rank,current_posting where person_biodata.belt_no=current_rank.belt_no and person_biodata.belt_no=current_posting.belt_no ;

current_posting视图定义如下:

select p.belt_no belt_no,ps.ps_name police_station,pl.pl_name posting_as,p.st_date   from p_posting p,post_list pl,police_station ps   where  p.ps_id=ps.ps_id and   p.pl_id=pl.pl_id  and  (p.belt_no,p.st_date) IN(select belt_no,max(st_date) from p_posting group by belt_no); 

current_rank视图定义如下:

select p.belt_no belt_no,r.r_name from p_rank p,rank r       where      p.r_id=r.r_id      and      (p.belt_no,p.st_date) IN (select belt_no,max(st_date) from p_rank group by belt_no)
4

2 回答 2

1

某些版本的 MySQL 在子查询和子查询方面存在特定问题in,您在此视图中会遇到:

select p.belt_no belt_no,ps.ps_name police_station,pl.pl_name posting_as,p.st_date
from p_posting p,post_list pl,police_station ps
where p.ps_id=ps.ps_id and p.pl_id=pl.pl_id and
      (p.belt_no,p.st_date) IN(select belt_no,max(st_date) from p_posting group by belt_no)

尝试将其更改为:

where exists (select 1
              from posting
              group by belt_no
              having belt_no = p.belt_no and p.st_date = max(st_date)
             )

当然,可能还有其他问题。至少,您可以对查询进行格式化,使其可读并使用 ANSI 标准连接语法。能够读取查询将是提高其性能的第一步。然后你应该explain在 MySQL 中使用来查看查询计划是什么样的。

于 2013-06-20T19:55:12.463 回答
1

Muhammad Jawad 就这么简单。您已经在表上创建了允许数据库应用程序快速查找数据的索引,但是如果您更改/更新(索引表)表(例如:插入、更新、删除),那么没有应用索引的表需要更多时间表,因为索引也需要更新,因此每个索引都将被更新,这会花费太多时间。因此,您应该在我们仅将其用于搜索目的的列或表上应用索引。希望这会帮助你。感谢你。

于 2013-06-30T04:29:21.717 回答