Thanks for the responses to everyone! Here is the result for the explains.
============view query=============
explain select * from admin_exam_view where dateexam = '2012-08-13';
+----+-------------+-------+------+-----------------+------------+---------+----------------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref
| rows | Extra |
+----+-------------+-------+------+-----------------+------------+---------+----------------------------+--------+-------------+
| 1 | SIMPLE | p | ALL | DOB | NULL | NULL | NULL
| 281123 | Using where |
| 1 | SIMPLE | e | ref | IdPatient | IdPatient | 99 |
RIS_archive.p.IdPatient | 6 | Using where |
| 1 | SIMPLE | ec | ref | Quantity,IdExam | IdExam | 138 |
RIS_archive.e.IdExam | 3 | |
| 1 | SIMPLE | c | ref | IdApptType | IdApptType | 51 | func
| 1 | |
| 1 | SIMPLE | a | ref | IdAppt | IdAppt | 99 |
RIS_archive.e.IdAppt | 1 | Using where |
| 1 | SIMPLE | af | ref | IdAffil | IdAffil | 93 |
RIS_archive.c.IdPractAffil | 1 | |
+----+-------------+-------+------+-----------------+------------+---------+----------------------------+--------+-------------+
=============direct query=============
+----+-------------+-------+------+--------------------------------+------------+---------+----------------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len
| ref | rows | Extra |
+----+-------------+-------+------+--------------------------------+------------+---------+----------------------------+--------+-------------+
| 1 | SIMPLE | p | ALL | IdPatient_UNIQUE,IdPatient,DOB | NULL | NULL
| NULL | 281123 | Using where |
| 1 | SIMPLE | e | ref | IdPatient,statusnumber,IdAppt | IdPatient | 99
| RIS_archive.p.IdPatient | 6 | Using where |
| 1 | SIMPLE | a | ref | PRIMARY,zzk,IdAppt | IdAppt | 99
| RIS_archive.e.IdAppt | 1 | Using where |
| 1 | SIMPLE | ec | ref | Quantity,IdExam | IdExam | 138
| RIS_archive.e.IdExam | 3 | |
| 1 | SIMPLE | c | ref | IdApptType | IdApptType | 51
| func | 1 | |
| 1 | SIMPLE | af | ref | IdAffil | IdAffil | 93
| RIS_archive.c.IdPractAffil | 1 | |
+----+-------------+-------+------+--------------------------------+------------+---------+----------------------------+--------+-------------+
I can't tell any practical difference between the two.
Jim McNeely
On Aug 23, 2012, at 12:39 PM, Shawn Green wrote:
> On 8/23/2012 2:30 PM, James W. McNeely wrote:
>> I am working on a view based on this query:
>>
>> =======================================
>> SELECT
>> -- Patient Info
>> p.IdPatient,
>> p.IdLastword MRN,
>> p.NameLast,
>> p.NameFirst,
>> p.Addr1,
>> p.Addr2,
>> p.AddrCity,
>> p.AddrState,
>> p.AddrZip,
>> p.Gender,
>> p.DateOfBirth,
>> -- Provider Info
>> af.IdAffil,
>> af.PractName,
>> af.OfficeName,
>> -- Exam Info
>> e.IdExam,
>> e.dateexam,
>> a.WorkArea dept,
>> a.Room location,
>> e.ProcModeCode,
>> e.ProcName,
>> e.IdRefSite,
>> ec.IdCPT,
>> e.zzk exam_zzk,
>> ec.zzk examcpt_zzk
>> FROM patient_ p
>> LEFT JOIN exams e ON e.IdPatient = p.IdPatient
>> LEFT JOIN Examcpt_ ec ON (e.IdExam = ec.IdExam AND '1' = Quantity)
>> LEFT JOIN Copy_ c ON CONCAT(e.IdAppt , '0') = c.IdApptType
>> LEFT JOIN Appt_ a ON e.IdAppt = a.IdAppt
>> LEFT JOIN Affil_ af ON c.IdPractAffil = af.IdAffil
>> WHERE
>> p.AddrState = 'WA'
>> AND e.statusnumber = '4'
>> AND e.IdRefSite <> 'S50'
>> AND e.IdRefSite <> 'S51'
>> AND e.IdREfSite <> 'S63'
>> AND p.DateOfBirth < DATE_ADD(CURDATE(), INTERVAL '-2' MONTH)
>> AND a.zzk IS NOT NULL
>> ============================================
>>
>> If I run this query itself (not in the view), and add this:
>>
>> AND e.dateexam = '2012-08-13'
>>
>> it runs like lightning, super fast. But if I run the query against the view, for
> example "SELECT * FROM exam_view WHERE dateexam = '2012-08-13'
>>
>> It is so glacially slow that I end up having to kill the query. What is going on,
> and how can I fix this?
>>
>
> Look at the two EXPLAINs. I believe that when you run the query directly, you get to
> optimize that term into the execution of the view. When you run it through the view, the
> ALGORITHM is set to force the view to materialize all of the rows in the query, then scan
> those to find the rows that match your condition.
>
> When you execute the query manually, you are getting the benefits of peformance as
> you would have for ALGORITHM=MERGE in the VIEW. However since you are not getting those
> benefits, it looks like you are in an ALGORITHM=TEMPTABLE situation.
>
> http://dev.mysql.com/doc/refman/5.5/en/view-algorithms.html
>
> The explain plans will clearly show which situation you are in.
> --
> Shawn Green
> MySQL Principal Technical Support Engineer
> Oracle USA, Inc. - Hardware and Software, Engineered to Work Together.
> Office: Blountville, TN
>
>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe: http://lists.mysql.com/mysql
>