Dear listmembers

I am using MySQL 4.0.25.

I am trying to figure out how indexes should be defined to make the
following query as fast as possible (i.e. use indexes):

(shell script, for copy/paste)

echo "DROP TABLE IF EXISTS lrows;" | mysql test

echo "
CREATE TABLE IF NOT EXISTS lrows (
lock_id    INT NOT NULL AUTO_INCREMENT,
lock_date  DATETIME NOT NULL,
lock_usr   VARCHAR(255) NOT NULL,
lock_db    VARCHAR(255) NOT NULL,
lock_table VARCHAR(255) NOT NULL,
lock_row   INT NOT NULL DEFAULT 0,
lock_pid   INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (lock_id),
INDEX lockone (lock_pid, lock_row),
INDEX locktwo (lock_row, lock_pid, lock_db(16), lock_table(16))
) TYPE=MYISAM;" | mysql test

# some sample data
echo "
INSERT INTO lrows VALUES (NULL,NOW(),'tsp','preg','mbrs',1,1000);
INSERT INTO lrows VALUES (NULL,NOW(),'tsp','preg','mbrs',2,1000);
INSERT INTO lrows VALUES (NULL,NOW(),'tsp','preg','mbrs',3,1000);
INSERT INTO lrows VALUES (NULL,NOW(),'mfu','preg','mbrs',2,9000);
INSERT INTO lrows VALUES (NULL,NOW(),'mfu','preg','mbrs',5,9000);
INSERT INTO lrows VALUES (NULL,NOW(),'sfa','dbto','othr',2,8000);
" | mysql test

# my query:
echo "EXPLAIN SELECT t2.lock_id FROM lrows AS t1
        INNER JOIN lrows AS t2 ON t1.lock_row = t2.lock_row
        WHERE t1.lock_pid   =  1000
        AND   t2.lock_pid   != 1000
        AND   t2.lock_db    = 'preg'
        AND   t2.lock_table = 'mbrs'
        LIMIT 1;" | mysql  -E test

# I try to find the 4th row which duplicates lock_row (value 2) for
# a certain value of lock_db and lock_table but a different lock_pid

EXPLAIN gives:

*************************** 1. row ***************************
        table: t1
         type: ref
possible_keys: lockone,locktwo
          key: lockone
      key_len: 4
          ref: const
         rows: 2
        Extra: Using where; Using index
*************************** 2. row ***************************
        table: t2
         type: ALL
possible_keys: locktwo
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 5
        Extra: Using where

This looks quite good for t1 but does not use any index for t2.
How should I set up my index to improve this situation?

Any help is appreciated.

Thomas Spahni


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

Reply via email to