Just a thought, did you try running Optimize Table from the MySQL
Administrator.  I'm thinking that when you restarted it re-examined the
table statistics and was able to pick a better index.
On Wed, January 17, 2007 14:31, John Anderson said:
>
>
> mysql> SELECT SQL_NO_CACHE COUNT(rb.subscription_id) as
> recurring_cc_count,
>
>     ->   SUM(rb.grace_price) as recurring_cc,
>
>     ->   COUNT(sb.subscription_id) as single_cc_count,
>
>     ->   SUM(sb.initial_amt) as single_cc
>
>     -> FROM customerdetail a
>
>     ->   LEFT JOIN recurringbilling rb
>
>     ->     ON a.subscription_id = rb.subscription_id
>
>     ->   LEFT JOIN singlebilling sb
>
>     ->     ON a.subscription_id = sb.subscription_id
>
>     ->   LEFT JOIN (global.subscriptionExchangeRate as ser INNER JOIN
> global.currencyCodes as cur)
>
>     ->     ON (a.subscription_id = ser.subscriptionId AND
> ser.billedCurrencyCode = cur.currencyCode)
>
>     -> WHERE client_accnum = '12345'
>
>     ->   AND a.trans_timestamp
>
>     ->   BETWEEN '20070108000000' AND '20070108235959';
>
> +--------------------+--------------+-----------------+-----------+
>
> | recurring_cc_count | recurring_cc | single_cc_count | single_cc |
>
> +--------------------+--------------+-----------------+-----------+
>
> |                  4 |       119.80 |               0 |      NULL |
>
> +--------------------+--------------+-----------------+-----------+
>
> 1 row in set (0.40 sec)
>
> mysql> explain SELECT SQL_NO_CACHE COUNT(rb.subscription_id) as
> recurring_cc_count,
>
>     ->   SUM(rb.grace_price) as recurring_cc,
>
>     ->   COUNT(sb.subscription_id) as single_cc_count,
>
>     ->   SUM(sb.initial_amt) as single_cc
>
>     -> FROM customerdetail a
>
>     ->   LEFT JOIN recurringbilling rb
>
>     ->     ON a.subscription_id = rb.subscription_id
>
>     ->   LEFT JOIN singlebilling sb
>
>     ->     ON a.subscription_id = sb.subscription_id
>
>     ->   LEFT JOIN (global.subscriptionExchangeRate as ser INNER JOIN
> global.currencyCodes as cur)
>
>     ->     ON (a.subscription_id = ser.subscriptionId AND
> ser.billedCurrencyCode = cur.currencyCode)
>
>     -> WHERE client_accnum = '12345'
>
>     ->   AND a.trans_timestamp
>
>     ->   BETWEEN '20070108000000' AND '20070108235959';
>
> +----+-------------+-------+--------+-----------------------------------
> -----------------------------+-----------------+---------+--------------
> -----------------+------+--------------------------+
>
> | id | select_type | table | type   | possible_keys
> | key             | key_len | ref                           | rows |
> Extra                    |
>
> +----+-------------+-------+--------+-----------------------------------
> -----------------------------+-----------------+---------+--------------
> -----------------+------+--------------------------+
>
> |  1 | SIMPLE      | a     | range  |
> client_idx,trans_idx,accno_trans_idx,accnumactive,accsubactive |
> accno_trans_idx | 7       | NULL                          |    4 | Using
> where; Using index |
>
> |  1 | SIMPLE      | rb    | eq_ref | PRIMARY
> | PRIMARY         | 8       | company.a.subscription_id      |    1 |
> |
>
> |  1 | SIMPLE      | sb    | eq_ref | PRIMARY
> | PRIMARY         | 8       | company.a.subscription_id      |    1 |
> |
>
> |  1 | SIMPLE      | ser   | ref    | PRIMARY,billedCurrencyCode
> | PRIMARY         | 8       | company.a.subscription_id      |    1 |
> |
>
> |  1 | SIMPLE      | cur   | eq_ref | PRIMARY
> | PRIMARY         | 2       | global.ser.billedCurrencyCode |    1 |
> Using index              |
>
> +----+-------------+-------+--------+-----------------------------------
> -----------------------------+-----------------+---------+--------------
> -----------------+------+--------------------------+
>
> 5 rows in set (0.00 sec)
>
>
>
> mysql> show index from customerdetail;
>
> +----------------+------------+-----------------+--------------+--------
> ---------+-----------+-------------+----------+--------+------+---------
> ---+---------
>
> +
>
> | Table          | Non_unique | Key_name        | Seq_in_index |
> Column_name     | Collation | Cardinality | Sub_part | Packed | Null |
> Index_type | Comment
>
> |
>
> +----------------+------------+-----------------+--------------+--------
> ---------+-----------+-------------+----------+--------+------+---------
> ---+---------
>
> ..........................SNIP........................................
>
> | customerdetail |          1 | accno_trans_idx |            1 |
> client_accnum   | A         |       17052 |     NULL | NULL   |      |
> BTREE      |
>
> |
>
> | customerdetail |          1 | accno_trans_idx |            2 |
> trans_timestamp | A         |    49042196 |     NULL | NULL   |      |
> BTREE      |
>
> ..........................SNIP........................................
>
> +----------------+------------+-----------------+--------------+--------
> ---------+-----------+-------------+----------+--------+------+---------
> ---+---------+
>
>
>
> The query executes orders of magnitude faster, and the EXPLAIN shows
> why.  MySQL has now chosen to use the accno_trans_idx index for the
> customerdetail table which has much better cardinality (almost 1 key per
> row).
>
>
>
> The obvious workaround is use FORCE INDEX(accno_trans_idx) in the query
> for now, but I'm beginning to think this may be a bug.  Has anyone else
> had any similar issues?  I haven't found anything like this in the bug
> database though.  If anyone doesn't see anything blatantly wrong with my
> setup, I'll submit this as a bug.
>
>
>
>
>
> Further information:
>
>
>
> Here is how MySQL is configured, and the my.cnf I'm using.
>
>
>
> CC="gcc -m64" CXX="g++ -m64" \
>
> ./configure --prefix=/usr \
>
> --sbindir=/usr/sbin \
>
> --libexecdir=/usr/sbin \
>
> --infodir=/usr/share/man \
>
> --mandir=/usr/share/info \
>
> --libdir=/usr/lib64 \
>
> --enable-shared \
>
> --enable-static \
>
> --enable-thread-safe-client \
>
> --enable-local-infile \
>
> --with-extra-charsets=all \
>
> --with-gnu-ld \
>
> --with-pthread \
>
> --with-unix-socket-path=/tmp/mysql.sock \
>
> --with-mysqld-user=mysql \
>
> --without-debug \
>
> --with-openssl=/usr \
>
> --with-big-tables \
>
> --with-archive-storage-engine \
>
> --with-csv-storage-engine \
>
> --with-blackhole-storage-engine \
>
> --with-federated-storage-engine \
>
> --with-berkeley-db \
>
> --with-berkeley-includes=/usr/include \
>
> --with-berkeley-libs=/usr/lib64 \
>
> --without-extra-tools \
>
> --with-mysqlmanager=no \
>
> --with-ndbcluster \
>
> --without-geometry
>
>
>
>
>
> ----------------------
>
> [mysqld]
>
> #Directories
>
> datadir=/var/db/mysql
>
> socket=/tmp/mysql.sock
>
> log-error=/var/log/mysql/mysql.log
>
> pid-file=/var/run/mysqld/mysqld.pid
>
> tmpdir=/tmp
>
>
>
> #Replication
>
> server-id=127
>
> #log-bin
> replicate-ignore-db=mysql
>
> #log-slave-updates
>
>
>
>
>
> #Network
>
> max_connections=1024
>
> max_allowed_packet=1024M
>
> net_buffer_length=16k
>
>
>
> #Files
>
> open_files_limit=8192 # Anything higher needs corresponding ulimit entry
>
>
>
> #Buffers
>
> join_buffer_size=128M
>
> key_buffer_size=512M
>
> key_buffer=512M
>
> large_pages
>
> max_heap_table_size=1024M
>
> myisam_sort_buffer_size=256M
>
> read_buffer_size=64M
>
> read_buffer=64M
>
> query_cache_size=32M
>
> query_cache_type=1
>
> record_buffer=512
>
> sort_buffer=512M
>
> table_cache=512
>
> thread_cache=4M
>
> thread_stack=512K
>
> thread_cache_size=300
>
> thread_concurrency=16
>
> tmp_table_size=1G
>
>
> #innodb
>
> innodb-table-locks=off
>
> transaction_isolation=REPEATABLE-READ
>
> innodb_buffer_pool_size=1024M
>
> innodb_log_buffer_size=8M
>
> innodb_flush_log_at_trx_commit=0
>
> innodb_log_file_size=128M
>
> innodb_additional_mem_pool_size=32M
>
> innodb_thread_concurrency=16
>
> innodb_commit_concurrency=4
>
> innodb_flush_method=O_DIRECT
>
> innodb_open_files=8192
>
> innodb_sync_spin_loops=32
>
> innodb_thread_sleep_delay=1000
>
> innodb_autoextend_increment=1024M
>
> innodb_file_per_table=TRUE
>
>
>
> [client]
>
> socket=/tmp/mysql.sock
>
>
>
>
>
> John Anderson
>
>
>
>


-------

William R. Mussatto, Senior Systems Engineer
http://www.csz.com
Ph. 909-920-9154 ext. 27
FAX. 909-608-7061


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

Reply via email to