Thanx, that's exactly it. I feel a bit embarassed as this came up on
the list about 2-3 weeks ago, and I found the answer as I was waiting
for the replies.
-Sheeri
On 1/20/06, gerald_clark <[EMAIL PROTECTED]> wrote:
> sheeri kritzer wrote:
>
> >Hi folks,
> >
> >I'm attempting to optimize a query -- it's quite a simple one, actually.
> >
> >SELECT uid from Bill_Sales WHERE startDate > '[some date]';
> >
> >mysql> show create table Bill_Sales\G
> >*************************** 1. row ***************************
> > Table: Bill_Sales
> >Create Table: CREATE TABLE `Bill_Sales` (
> > `sales_id` int(4) unsigned NOT NULL auto_increment,
> > `uid` int(10) unsigned NOT NULL default '0',
> > `created` datetime NOT NULL default '0000-00-00 00:00:00',
> > `modified` timestamp NOT NULL default '0000-00-00 00:00:00',
> > `startDate` date NOT NULL default '0000-00-00',
> > `endDate` date NOT NULL default '0000-00-00',
> > `typesale` enum('pos','void','chargeback','refunded') default NULL,
> > PRIMARY KEY (`sales_id`),
> > KEY `uid` (`uid`),
> > KEY `startDate` (`startDate`,`endDate`,`typesale`),
> > KEY `endDate` (`endDate`,`startDate`,`typesale`)
> >) ENGINE=MyISAM DEFAULT CHARSET=latin1
> >1 row in set (0.00 sec)
> >
> >mysql> explain SELECT uid from Bill_Sales WHERE startDate > '2005-11-22';
> >+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+
> >| id | select_type | table | type | possible_keys | key |
> >key_len | ref | rows | Extra |
> >+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+
> >| 1 | SIMPLE | Bill_Sales | ALL | startDate | NULL |
> >NULL | NULL | 1028766 | Using where |
> >+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+
> >1 row in set (0.00 sec)
> >
> >mysql> explain SELECT uid from Bill_Sales WHERE startDate > '2005-11-23';
> >+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------------+
> >| id | select_type | table | type | possible_keys | key |
> >key_len | ref | rows | Extra |
> >+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------------+
> >| 1 | SIMPLE | Bill_Sales | range | startDate | startDate |
> > 3 | NULL | 192022 | Using where |
> >+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------------+
> >1 row in set (0.00 sec)
> >
> >The cutoff date for using the index versus not using the index is
> >around 2 months ago!
> >
> >This always happens on the production server, but I cannot get it to
> >work if I recreate the table without all the data. However, we've
> >replicated the data to a few machines, and the explains are consistent
> >with the replicated data.
> >
> >So I run a REPAIR TABLE, which should fix the indexes. It definitely
> >changed something, because now the cutoff date is about a week ago.
> >
> >mysql> explain SELECT uid from Bill_Sales WHERE startDate > "2006-01-13";
> >+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+
> >| id | select_type | table | type | possible_keys | key |
> >key_len | ref | rows | Extra |
> >+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+
> >| 1 | SIMPLE | Bill_Sales | ALL | startDate | NULL |
> >NULL | NULL | 1028777 | Using where |
> >+----+-------------+------------+------+---------------+------+---------+------+---------+-------------+
> >1 row in set (0.00 sec)
> >
> >mysql> explain SELECT uid from Bill_Sales WHERE startDate > "2006-01-14";
> >+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------------+
> >| id | select_type | table | type | possible_keys | key |
> >key_len | ref | rows | Extra |
> >+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------------+
> >| 1 | SIMPLE | Bill_Sales | range | startDate | startDate |
> > 3 | NULL | 190891 | Using where |
> >+----+-------------+------------+-------+---------------+-----------+---------+------+--------+-------------+
> >1 row in set (0.00 sec)
> >
> >Why would the query do this? And why does it change when I run a repair
> >table?
> >
> >(show status:
> >mysql> show status;
> >+----------------------------+------------+
> >| Variable_name | Value |
> >+----------------------------+------------+
> >| Aborted_clients | 74279 |
> >| Aborted_connects | 146 |
> >| Binlog_cache_disk_use | 0 |
> >| Binlog_cache_use | 0 |
> >| Bytes_received | 1163526992 |
> >| Bytes_sent | 359522512 |
> >| Com_admin_commands | 0 |
> >| Com_alter_db | 0 |
> >| Com_alter_table | 45 |
> >| Com_analyze | 1 |
> >| Com_backup_table | 0 |
> >| Com_begin | 0 |
> >| Com_change_db | 154039613 |
> >| Com_change_master | 0 |
> >| Com_check | 0 |
> >| Com_checksum | 0 |
> >| Com_commit | 0 |
> >| Com_create_db | 0 |
> >| Com_create_function | 0 |
> >| Com_create_index | 0 |
> >| Com_create_table | 26 |
> >| Com_dealloc_sql | 0 |
> >| Com_delete | 15447773 |
> >| Com_delete_multi | 0 |
> >| Com_do | 0 |
> >| Com_drop_db | 0 |
> >| Com_drop_function | 0 |
> >| Com_drop_index | 0 |
> >| Com_drop_table | 27 |
> >| Com_drop_user | 0 |
> >| Com_execute_sql | 0 |
> >| Com_flush | 2 |
> >| Com_grant | 0 |
> >| Com_ha_close | 0 |
> >| Com_ha_open | 0 |
> >| Com_ha_read | 0 |
> >| Com_help | 0 |
> >| Com_insert | 10401852 |
> >| Com_insert_select | 136718 |
> >| Com_kill | 0 |
> >| Com_load | 0 |
> >| Com_load_master_data | 0 |
> >| Com_load_master_table | 0 |
> >| Com_lock_tables | 1 |
> >| Com_optimize | 2 |
> >| Com_preload_keys | 0 |
> >| Com_prepare_sql | 0 |
> >| Com_purge | 0 |
> >| Com_purge_before_date | 0 |
> >| Com_rename_table | 1 |
> >| Com_repair | 3 |
> >| Com_replace | 4126896 |
> >| Com_replace_select | 18322588 |
> >| Com_reset | 0 |
> >| Com_restore_table | 0 |
> >| Com_revoke | 0 |
> >| Com_revoke_all | 0 |
> >| Com_rollback | 0 |
> >| Com_savepoint | 0 |
> >| Com_select | 573190719 |
> >| Com_set_option | 1181 |
> >| Com_show_binlog_events | 0 |
> >| Com_show_binlogs | 0 |
> >| Com_show_charsets | 0 |
> >| Com_show_collations | 0 |
> >| Com_show_column_types | 0 |
> >| Com_show_create_db | 1 |
> >| Com_show_create_table | 8 |
> >| Com_show_databases | 10499 |
> >| Com_show_errors | 0 |
> >| Com_show_fields | 2540 |
> >| Com_show_grants | 0 |
> >| Com_show_innodb_status | 0 |
> >| Com_show_keys | 2 |
> >| Com_show_logs | 0 |
> >| Com_show_master_status | 0 |
> >| Com_show_new_master | 0 |
> >| Com_show_open_tables | 0 |
> >| Com_show_privileges | 0 |
> >| Com_show_processlist | 24 |
> >| Com_show_slave_hosts | 0 |
> >| Com_show_slave_status | 21192 |
> >| Com_show_status | 23851 |
> >| Com_show_storage_engines | 0 |
> >| Com_show_tables | 64075 |
> >| Com_show_variables | 6 |
> >| Com_show_warnings | 0 |
> >| Com_slave_start | 12 |
> >| Com_slave_stop | 0 |
> >| Com_truncate | 100 |
> >| Com_unlock_tables | 1 |
> >| Com_update | 833306826 |
> >| Com_update_multi | 0 |
> >| Connections | 153975605 |
> >| Created_tmp_disk_tables | 16 |
> >| Created_tmp_files | 1544309 |
> >| Created_tmp_tables | 11011061 |
> >| Delayed_errors | 0 |
> >| Delayed_insert_threads | 0 |
> >| Delayed_writes | 0 |
> >| Flush_commands | 2 |
> >| Handler_commit | 45 |
> >| Handler_delete | 395252 |
> >| Handler_discover | 0 |
> >| Handler_read_first | 191695 |
> >| Handler_read_key | 717659723 |
> >| Handler_read_next | 1440309480 |
> >| Handler_read_prev | 0 |
> >| Handler_read_rnd | 1055091498 |
> >| Handler_read_rnd_next | 2185842449 |
> >| Handler_rollback | 133982982 |
> >| Handler_update | 9610342 |
> >| Handler_write | 1511376494 |
> >| Key_blocks_not_flushed | 0 |
> >| Key_blocks_unused | 56612 |
> >| Key_blocks_used | 153316 |
> >| Key_read_requests | 1615349579 |
> >| Key_reads | 320440 |
> >| Key_write_requests | 40643476 |
> >| Key_writes | 21199977 |
> >| Max_used_connections | 955 |
> >| Not_flushed_delayed_rows | 0 |
> >| Open_files | 101 |
> >| Open_streams | 0 |
> >| Open_tables | 345 |
> >| Opened_tables | 1637 |
> >| Qcache_free_blocks | 1289 |
> >| Qcache_free_memory | 31947024 |
> >| Qcache_hits | 3002872 |
> >| Qcache_inserts | 181537 |
> >| Qcache_lowmem_prunes | 150945 |
> >| Qcache_not_cached | 573396839 |
> >| Qcache_queries_in_cache | 788 |
> >| Qcache_total_blocks | 2935 |
> >| Questions | 1766422261 |
> >| Rpl_status | NULL |
> >| Select_full_join | 137 |
> >| Select_full_range_join | 0 |
> >| Select_range | 1139287 |
> >| Select_range_check | 0 |
> >| Select_scan | 2550 |
> >| Slave_open_temp_tables | 0 |
> >| Slave_running | ON |
> >| Slave_retried_transactions | 0 |
> >| Slow_launch_threads | 0 |
> >| Slow_queries | 1019 |
> >| Sort_merge_passes | 150 |
> >| Sort_range | 2393850 |
> >| Sort_rows | 1694680796 |
> >| Sort_scan | 10551731 |
> >| Table_locks_immediate | 1489264630 |
> >| Table_locks_waited | 4822 |
> >| Threads_cached | 127 |
> >| Threads_connected | 1 |
> >| Threads_created | 7558 |
> >| Threads_running | 1 |
> >| Uptime | 3593626 |
> >+----------------------------+------------+
> >157 rows in set (0.01 sec)
> >)
> >
> >my.cnf:
> >
> ># The MySQL server
> >[mysqld]
> >old-passwords
> >skip-locking
> >port = 3306
> >socket = /var/lib/mysql/mysql.sock
> >key_buffer = 190M
> >max_allowed_packet = 16M
> >table_cache = 1600
> >sort_buffer_size = 4M
> >read_buffer_size = 256K
> >myisam_sort_buffer_size = 4M
> >thread_cache = 128
> >ft_min_word_len = 3
> >tmp_table_size = 32M
> >
> >
> ># Query Cache Settings - OFF due to overload of Session table
> >query_cache_size = 32M
> >query_cache_type = 2
> >
> >
> >
> ># Log queries taking longer than "long_query_time" seconds
> >long_query_time = 4
> >log-slow-queries = /var/lib/mysql/slow-queries.log
> >log-error = /var/lib/mysql/mysqld.err
> >
> >
> ># Try number of CPU's*2 for thread_concurrency
> >thread_concurrency = 16
> >
> >interactive_timeout = 28800
> >wait_timeout = 30
> >
> >max_connections = 1947
> >max_connect_errors = 128
> >
> ># Uncomment the following if you are using InnoDB tables
> >innodb_data_home_dir = /var/lib/mysql/
> >innodb_data_file_path = ibdata1:2000M;ibdata2:2000M;ibdata3:2000M
> >innodb_log_group_home_dir = /var/lib/mysql/
> >innodb_log_arch_dir = /var/lib/mysql/
> >
> ># You can set .._buffer_pool_size up to 50 - 80 %
> ># of RAM but beware of setting memory usage too high
> >innodb_buffer_pool_size = 2000M
> >innodb_additional_mem_pool_size = 32M
> >
> ># Set .._log_file_size to 25 % of buffer pool size
> >innodb_log_file_size = 128M
> >innodb_log_buffer_size = 32M
> >innodb_flush_log_at_trx_commit = 0
> >innodb_lock_wait_timeout = 50
> >innodb_thread_concurrency = 16
> >innodb_file_io_threads = 4
> >innodb_table_locks = 0
> >
> >
> >-Sheeri
> >
> >
> >
> Once about 1/3 of the data matches, it is quicker to not use the index.
> This date seems to be the threshold.
>
>
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]