>
> 1. MyISAM locks _tables_. That can cause other connections
> to be blocked. Solution: switch to InnoDB. Caution: There
> are a few caveats when switching; see
> https://kb.askmonty.org/en/converting-tables-from-myisam-to-innodb/
>
> 2. As mentioned by Shawn, the Query Cache can be more trouble
> than it is worth. However 90 seconds cannot be blamed on the
> QC. Still, shrink it or turn it off:
> * If frequently writing to tables, turn it off (type=OFF _and_ size=0)
> * If less frequently, then decide which queries will benefit,
> add SQL_CACHE to them, set type=DEMAND and size=50M (no larger).
>
> 3. Meanwhile, try to make that long query more efficient.
> Can you show it to us, together with SHOW CREATE TABLE, SHOW
> TABLE STATUS, and EXPLAIN ?
>
Thanks for the feedback, Rick.
There are 1200+ tables in the database, so I don't think you want a SHOW CREATE TABLE, SHOW TABLE STATUS, EXPLAIN for all of them. :-) The query in question is always some variation of the following. From looking at this, which table(s) would you like to see this information for?
# Time: 130507 18:14:26
# User@Host: site150_DbUser[site150_DbUser] @ cognos08.mycharts.md [192.168.10.85]
# Query_time: 82 Lock_time: 0 Rows_sent: 1 Rows_examined: 914386
select (mod(dayofweek(`Query1`.`Appointment_Date`)+7-1,7)), {fn CONCAT({fn CONCAT({fn CONCAT(cast(extract(hour from `Time_Difference_Query`.`Created_Date`) as char(25)), ':')}, cast(extract(minute from `Time_Difference_Query`.`Created_Date`) as char(25)))}, ':')}, `Time_Difference_Query`.`Created_Date`, `Query1`.`Appointment_Provider_Name` from (select distinct `EMR_ENCOUNTER`.`encType` as "Encounter_Type" , case when `EMR_ENCOUNTER`.`encLock` = 0 then 'UnLocked' else 'Locked' end as "Chart_Lock_Status" , `EMR_ENCOUNTER`.`notesDoneTime` as "Notes_Done_Time" , `EMR_ENCOUNTER`.`dateOut` as "Notes_Done_Date" , `EMR_ENCOUNTER`.`timeIn` as "Appointments_Checked_In" , `EMR_ENCOUNTER`.`timeOut` as "Appointments_Checked_Out" , `EMR_ENCOUNTER`.`depTime` as "Appointments_Departure_Time" , `EMR_ENCOUNTER`.`arrivedTime` as "Appointments_Arrived_Time" , `EMR_ENCOUNTER`.`endTime` as "Appointment_End_Time" , `EMR_ENCOUNTER`.`startTime` as "Appointment_Start_Time" , `EMR_ENCOUNTER`.`date` as "Appointment_Date" , `EMR_ENCOUNTER`.`encounterID` as "Encounter_ID" , `EDI_FACILITIES`.`Name` as "Facility_Name" , `APPOINTMENT_PROVIDER`.`uid` as "Appointment_Provider_ID" , {fn CONCAT({fn CONCAT({fn CONCAT({fn CONCAT(`APPOINTMENT_PROVIDER`.`ulname`, ', ')}, `APPOINTMENT_PROVIDER`.`ufname`)}, ' ')}, `APPOINTMENT_PROVIDER`.`uminitial`)} as "Appointment_Provider_Name" from (`enc` `EMR_ENCOUNTER` LEFT OUTER JOIN `edi_facilities` `EDI_FACILITIES` on `EMR_ENCOUNTER`.`facilityId` = `EDI_FACILITIES`.`Id`) LEFT OUTER JOIN (`doctors` `APPOINTMENT_DOCTOR` INNER JOIN `users` `APPOINTMENT_PROVIDER` on `APPOINTMENT_DOCTOR`.`doctorID` = `APPOINTMENT_PROVIDER`.`uid`) on `EMR_ENCOUNTER`.`doctorID` = `APPOINTMENT_DOCTOR`.`doctorID` where `EMR_ENCOUNTER`.`encType` = 2 and `EMR_ENCOUNTER`.`date` between cast('2011-01-01' as date) and cast('2013-05-07' as date) and `EMR_ENCOUNTER`.`patientID` <> 8663 and `EMR_ENCOUNTER`.`VisitType` <> 'PTDASH' and `EMR_ENCOUNTER`.`deleteFlag` = 0 and `APPOINTMENT_PROVIDER`.`UserType` = 1 and `APPOINTMENT_PROVIDER`.`delFlag` = 0 and `EDI_FACILITIES`.`DeleteFlag` = 0) `Query1` LEFT OUTER JOIN (select distinct `Addressed_Query`.`moddate` as "Locked_Date" , `Created_Query`.`moddate` as "Created_Date" , `Created_Query`.`encounterid` as "encounterid" , `Created_Query`.`reason` as "reason" , `Created_Query`.`Patient_Name` as "Patient_Name" from (select distinct `SQL1`.`moddate` as "moddate" , `SQL1`.`encounterid` as "encounterid" , `SQL1`.`actionflag` as "actionflag" , `SQL1`.`ufname` as "ufname" , `SQL1`.`ulname` as "ulname" , `SQL1`.`reason` as "reason" , {fn CONCAT({fn CONCAT(`SQL1`.`ulname`, ', ')}, `SQL1`.`ufname`)} as "Patient_Name" from (select users.ufname,users.ulname,cast(reason as char(30)) as reason, telenc_loghist.actionflag,telenc_loghist.encounterid,telenc_loghist.moddate from telenc_loghist
inner join enc on enc.encounterid=telenc_loghist.encounterid
inner join users on users.uid=enc.patientid where actionflag in(0) and enc.date between '2011-01-01' and '2013-05-07') `SQL1`) `Created_Query` LEFT OUTER JOIN (select distinct `Q2`.`moddate` as "moddate" , `Q2`.`encounterid` as "encounterid" , `Q2`.`actionflag` as "actionflag" from (select telenc_loghist.actionflag,telenc_loghist.encounterid,telenc_loghist.moddate from telenc_loghist
inner join enc on enc.encounterid=telenc_loghist.encounterid where actionflag in(4) and enc.date between '2011-01-01' and '2013-05-07') `Q2`) `Addressed_Query` on `Created_Query`.`encounterid` = `Addressed_Query`.`encounterid` where NOT `Addressed_Query`.`moddate` is null) `Time_Difference_Query` on `Query1`.`Encounter_ID` = `Time_Difference_Query`.`encounterid` where `Query1`.`Appointment_Provider_ID` in (9118, 9119, 60922, 9116, 47495) and `Query1`.`Facility_Name` in ('Fremont Family Care') and `Query1`.`Appointment_Date` between cast(cast('2011-01-01' as date) as date) and cast(cast('2013-05-07' as date) as date) and `Query1`.`Appointment_Provider_ID` = 60922;
Also, the query cache size is currently set to 64MB. Do you really think turning it off is a good idea?
The my.cnf file follows...
[mysqld_safe]
timezone=America/Chicago
[mysqld]
#-optimization
skip-locking
skip-innodb
skip-bdb
query_cache_type = 1
tmp_table_size=1M
wait_timeout=2048
interactive_timeout=2048
table_cache=1024
query_cache_limit=1M
thread_concurrency = 4
key_buffer = 256M
query_cache_size=64M
max_allowed_packet = 1M
sort_buffer_size = 512K
read_buffer_size = 512K
myisam_sort_buffer_size = 128M
thread_cache_size=40
max_connections=500
max_tmp_tables=32
lower_case_table_names=1
#-turn on query logging
#log=/ha01_mysql/site150/mysql/query.log
log_slow_queries=/ha01_mysql/site150/mysql/slow_query.log
long_query_time=3
#-make this server a replication master
#log-bin = /ha01_mysql/site150/mysql/binlogs/
expire_logs_days=5
server-id=99
#replicate-do-db=mobiledoc_150
I'm thinking that our best solution may be to re-enable the slave (currently disabled) and point the nasty query at it.
By the way, we have considered switching to innodb, but there the advantages of MyISAM in our environment have usually outweighed.
--Eric
Disclaimer - May 10, 2013
This email and any files transmitted with it are confidential and intended solely for Rick James,Bruce Ferrell,mysql@lists.mysql.com. If you are not the named addressee you should not disseminate, distribute, copy or alter this email. Any views or opinions presented in this email are solely those of the author and might not represent those of Physicians' Managed Care or Physician Select Management. Warning: Although Physicians' Managed Care or Physician Select Management has taken reasonable precautions to ensure no viruses are present in this email, the company cannot accept responsibility for any loss or damage arising from the use of this email or attachments.
This disclaimer was added by Policy Patrol: http://www.policypatrol.com/
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/mysql