我创建了一个复杂的视图,它在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)
答案 0 :(得分:0)
某些版本的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标准连接语法。能够阅读查询将是提高其性能的第一步。然后你应该在MySQL中使用explain
来查看查询计划是什么样的。
答案 1 :(得分:0)
Muhammad Jawad 这很简单。您已经在表上创建了允许数据库应用程序快速查找数据的索引,但是如果您更改/更新(索引表)表(例如:inserst,update,delete),则需要更多时间才能应用索引表因为索引也需要更新所以每个索引都会更新,这需要花费太多时间。因此,您应该在我们使用它的列或表上应用索引,仅用于搜索目的。希望这会对你有所帮助。谢谢你。