A database is being used to log support calls for a call center. There are
around 25,000 clients in the database. The existing call notes were imported
from flat text files.
One table (call_notes) contains the call time, ticketid, noteid, ect..
Another table (call_notes_text) only contains noteid and note_text.
When I query the call_notes table for a specific noteid, the info is
returned instantly. However when I query the call_notes_text table for a
specific noteid it takes 15-17 seconds to return the data. The table has
around 15,000 rows with each row containing a field about the size of a
small newspaper article.
The server is a dual processor intel333 with 256k ram (RH7.2) running MySQL
3.23.41. When running the queries outline below CPU usage is only around
15% or so.
Each table contains an id which is key. I've copied and pasted results
from some EXPLAIN table queries below.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
mysql> explain call_notes;
+------------------+------------+------+-----+---------------------+--------
--------+
| Field | Type | Null | Key | Default | Extra
|
+------------------+------------+------+-----+---------------------+--------
--------+
| noteid | int(10) | | PRI | NULL |
auto_increment |
| ticketid | int(10) | | | 0 |
|
| userid | int(5) | | | 0 |
|
| contactid | int(5) | | | 0 |
|
| call_start | datetime | | | 0000-00-00 00:00:00 |
|
| call_end | datetime | | | 0000-00-00 00:00:00 |
|
| call_elapsed | time | | | 00:00:00 |
|
| call_seconds | int(10) | | | 0 |
|
| entered_statusid | tinyint(2) | | | 0 |
|
| datemodified | datetime | | | 0000-00-00 00:00:00 |
|
+------------------+------------+------+-----+---------------------+--------
--------+
10 rows in set (0.00 sec)
mysql> explain call_notes_text;
+-----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+----------------+
| noteid | int(10) | | PRI | NULL | auto_increment |
| note_text | text | | | | |
+-----------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> explain facility_contact;
+--------------+-------------+------+-----+---------------------+-----------
-----+
| Field | Type | Null | Key | Default | Extra
|
+--------------+-------------+------+-----+---------------------+-----------
-----+
| contactid | int(10) | | PRI | NULL |
auto_increment |
| fnum | varchar(8) | | | |
|
| contact | varchar(30) | | | |
|
| contactadded | datetime | | | 0000-00-00 00:00:00 |
|
+--------------+-------------+------+-----+---------------------+-----------
-----+
4 rows in set (0.00 sec)
mysql> explain users;
+--------------+--------------+------+-----+---------------------+----------
------+
| Field | Type | Null | Key | Default | Extra
|
+--------------+--------------+------+-----+---------------------+----------
------+
| userid | int(10) | | PRI | NULL |
auto_increment |
| username | varchar(50) | | | |
|
| password | varchar(50) | | | |
|
| deptid | tinyint(4) | | | 0 |
|
| jobtitleid | int(2) | | | 0 |
|
| namefirst | varchar(50) | | | |
|
| namelast | varchar(50) | | | |
|
| ext | int(5) | | | 0 |
|
| email | varchar(100) | | | |
|
| level | int(1) | | | 1 |
|
| senior | char(3) | | | |
|
| dateadded | datetime | | | 0000-00-00 00:00:00 |
|
| datemodified | datetime | | | 0000-00-00 00:00:00 |
|
| active | tinyint(1) | | | 1 |
|
+--------------+--------------+------+-----+---------------------+----------
------+
14 rows in set (0.00 sec)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Here is the actual query that is being used in the script. (I've broken
down so it's easier to read)
SELECT
call_notes.call_elapsed,
call_notes.call_seconds,
call_notes.call_start,
call_notes.call_end,
call_notes_text.note_text,
users.username,
users.namefirst,
users.email,
facility_contact.contactid,
facility_contact.contact
FROM
call_notes,
call_notes_text,
users,
facility_contact
WHERE
call_notes.ticketid = '1' &&
call_notes.userid = users.userid &&
call_notes.contactid = facility_contact.contactid &&
call_notes_text.noteid = call_notes.noteid
ORDER BY
call_notes.call_start DESC;
(results snipped)
1 row in set (17.89 sec)
Now I go to command line and run this query:
mysql> SELECT * FROM call_notes_text WHERE noteid='1';
(results snipped)
1 row in set (17.61 sec)
Alternately, if I just pull some data from the call_notes table:
mysql> SELECT * FROM call_notes WHERE noteid='1';
(results snipped)
1 row in set (0.19 sec)
And here's another that is interesting:
mysql> select * from call_notes_text limit 1;
(results snipped)
1 row in set (0.21 sec)
Finally, I ran an EXPLAIN SELECT on my main query. (fyi, ticketid 1 has a
noteid of 1)
EXPLAIN SELECT
call_notes.call_elapsed,
call_notes.call_seconds,
call_notes.call_start,
call_notes.call_end,
call_notes_text.note_text,
users.username,
users.namefirst,
users.email,
facility_contact.contactid,
facility_contact.contact
FROM
call_notes,
call_notes_text,
users,
facility_contact
WHERE
call_notes.ticketid = '1' &&
call_notes.userid = users.userid &&
call_notes.contactid = facility_contact.contactid &&
call_notes_text.noteid = call_notes.noteid
ORDER BY
call_notes.call_start DESC;
+------------------+--------+-------------------------+---------+---------+-
-----------------------+-------+---------------------------------+
| table | type | possible_keys | key | key_len |
ref | rows | Extra |
+------------------+--------+-------------------------+---------+---------+-
-----------------------+-------+---------------------------------+
| call_notes_text | ALL | PRIMARY,noteid,noteid_2 | NULL | NULL |
NULL | 14682 | Using temporary; Using filesort |
| call_notes | eq_ref | PRIMARY,noteid,noteid_2 | PRIMARY | 4 |
call_notes_text.noteid | 1 | where used |
| users | eq_ref | PRIMARY,userid | PRIMARY | 4 |
call_notes.userid | 1 | |
| facility_contact | eq_ref | PRIMARY,contactid | PRIMARY | 4 |
call_notes.contactid | 1 | |
+------------------+--------+-------------------------+---------+---------+-
-----------------------+-------+---------------------------------+
4 rows in set (0.00 sec)
Note the number of rows returned from call_notes_text. This matches the
total number of rows in that table.
But, if I run this:
mysql> EXPLAIN select * from call_notes_text where noteid='1';
+-----------------+-------+-------------------------+---------+---------+---
----+------+-------+
| table | type | possible_keys | key | key_len |
ref | rows | Extra |
+-----------------+-------+-------------------------+---------+---------+---
----+------+-------+
| call_notes_text | const | PRIMARY,noteid,noteid_2 | PRIMARY | 4 |
const | 1 | |
+-----------------+-------+-------------------------+---------+---------+---
----+------+-------+
1 row in set (0.03 sec)
It only returns one row (not 14682 rows).
It appears to be a problem with the query, as opposed to the actual table,
but I can't see where the problem is. Thanks for any help you can provide.
- Mike
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php