I have a very simple table that looks like this:
CREATE TABLE `contacts` (
`id` int(11) NOT NULL auto_increment,
`fullname` varchar(100) default NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY  (`id`),
KEY `user_id` (`user_id`),
KEY `user_id_2` (`user_id`,`fullname`),
CONSTRAINT `contacts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8


It's a bit of a lopsided table in that of the 1,000,100 records in the db,
1,000,000 of them belong to user_id 1. But I wouldn't expect this to
skew my results.

I am writing a little paging server that retrieves pages of data using
LIMIT and OFFSET.

I'm really surprised by how slowly my queries are running on a
relatively fast desktop machine. Records near the top of the list are
fine:
mysql> SELECT * FROM contacts WHERE user_id=1 ORDER BY fullname
      LIMIT 1 OFFSET 0;
+--------+--------------+-----------------------------+---------+----------+
| id     | fullname     | email                       | user_id | nickname |
+--------+--------------+-----------------------------+---------+----------+
| 371543 | Aaron Abbott | [EMAIL PROTECTED] |       1 | aaronab  |
+--------+--------------+-----------------------------+---------+----------+
1 row in set (0.03 sec)

But as I move down the list, queries run slower and slower:
mysql> SELECT * FROM contacts WHERE user_id=1 ORDER BY fullname
      LIMIT 1 OFFSET 100000;
+--------+--------------+-----------------------------+---------+----------+
| id     | fullname     | email                       | user_id | nickname |
+--------+--------------+-----------------------------+---------+----------+
| 726543 | Benny Abbott | [EMAIL PROTECTED] |       1 | bennyab  |
+--------+--------------+-----------------------------+---------+----------+
1 row in set (2.94 sec)

mysql> SELECT * FROM contacts WHERE user_id=1 ORDER BY fullname
      LIMIT 1 OFFSET 500000;
+--------+---------------+------------------------------+---------+----------+
| id     | fullname      | email                        | user_id | nickname |
+--------+---------------+------------------------------+---------+----------+
| 309543 | Jimmie Abbott | [EMAIL PROTECTED] |       1 | jimmieab |
+--------+---------------+------------------------------+---------+----------+
1 row in set (12.75 sec)

EXPLAIN says:
+----+-------------+----------+------+-------------------+-----------+---------+-------+--------+-------------+
| id | select_type | table    | type | possible_keys     | key       |
key_len | ref   | rows   | Extra       |
+----+-------------+----------+------+-------------------+-----------+---------+-------+--------+-------------+
|  1 | SIMPLE      | contacts | ref  | user_id,user_id_2 | user_id_2 |
4       | const | 506222 | Using where |
+----+-------------+----------+------+-------------------+-----------+---------+-------+--------+-------------+

In other words, it *is* using an index for this query. Anyone have any
advice for me?

Thanks,
Adam

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to