为什么MySQL 5.1.56中的MySQL查询速度如此之慢?

为什么MySQL 5.1.56中的MySQL查询速度如此之慢?,mysql,Mysql,以下查询在MySQL 5.0.67中以0.3秒的时间执行,在MySQL 5.1.56中以3.0秒的时间执行。为什么在以后的版本中速度要慢十倍 (数据库从5.0.67导出并导入到5.1.56中,因此结构相同。) 5.1.61的产品表 Action Keyname Type Unique Packed Column Cardinality Collation Null Comment Edit Drop PRIMARY BTREE Yes No produc

以下查询在MySQL 5.0.67中以0.3秒的时间执行,在MySQL 5.1.56中以3.0秒的时间执行。为什么在以后的版本中速度要慢十倍

(数据库从5.0.67导出并导入到5.1.56中,因此结构相同。)

5.1.61的产品表

Action  Keyname Type    Unique  Packed  Column  Cardinality Collation   Null    Comment
 Edit    Drop   PRIMARY BTREE   Yes No  product_id  493078  A       
 Edit    Drop   shop_id BTREE   Yes No  shop_id 0   A       
link    493078  A   
 Edit    Drop   title_2 BTREE   Yes No  title   0   A       
image   493078  A   
 Edit    Drop   brand   BTREE   No  No  brand   123269  A   YES 
 Edit    Drop   title   BTREE   No  No  title   493078  A       
 Edit    Drop   date    BTREE   No  No  date    41089   A       
 Edit    Drop   shop_id_2   BTREE   No  No  shop_id 12026   A       
 Edit    Drop   product_id  BTREE   No  No  product_id  493078  A       
date    493078  A   
 Edit    Drop   shop_id_3   BTREE   No  No  shop_id 12026   A       
date    49307   A   
 Edit    Drop   sale_date   BTREE   No  No  sale_date   5940    A
商店表5.0.67

Keyname Type    Cardinality Action  Field
PRIMARY  PRIMARY     502437              product_id
shop_id  UNIQUE  502437              shop_id
link
title_2  UNIQUE  502437              title
image
brand    INDEX   38649           brand
title    INDEX   251218              title
date     INDEX   125609              date
shop_id_2    INDEX   87              shop_id
product_id   INDEX   502437              product_id
date
shop_id_3    INDEX   125609              shop_id
date
sale_date    INDEX   187             sale_date
 Keyname    Type    Cardinality Action  Field
PRIMARY  PRIMARY     163             shop_id
Keyname Type    Cardinality Action  Field
product_id_2     UNIQUE  506094              product_id
sex
product_id   INDEX   506094              product_id
商店表5.161

Action  Keyname Type    Unique  Packed  Column  Cardinality Collation   Null    Comment
 Edit    Drop   PRIMARY BTREE   Yes No  shop_id 163 A
5.0.67的性别表

Keyname Type    Cardinality Action  Field
PRIMARY  PRIMARY     502437              product_id
shop_id  UNIQUE  502437              shop_id
link
title_2  UNIQUE  502437              title
image
brand    INDEX   38649           brand
title    INDEX   251218              title
date     INDEX   125609              date
shop_id_2    INDEX   87              shop_id
product_id   INDEX   502437              product_id
date
shop_id_3    INDEX   125609              shop_id
date
sale_date    INDEX   187             sale_date
 Keyname    Type    Cardinality Action  Field
PRIMARY  PRIMARY     163             shop_id
Keyname Type    Cardinality Action  Field
product_id_2     UNIQUE  506094              product_id
sex
product_id   INDEX   506094              product_id
5.1.61的性别表

Action  Keyname Type    Unique  Packed  Column  Cardinality Collation   Null    Comment
 Edit    Drop   product_id_2    BTREE   Yes No  product_id  0   A       
sex 496732  A   
 Edit    Drop   product_id  BTREE   No  No  product_id  496732  A
MySQL 5.1.61的my.cnf文件

[mysqladmin]
user=username

[mysqld]
basedir=/opt/bitnami/mysql
datadir=/opt/bitnami/mysql/data
port=3306
socket=/opt/bitnami/mysql/tmp/mysql.sock
tmpdir=/opt/bitnami/mysql/tmp

character-set-server=UTF8
collation-server=utf8_general_ci

max_allowed_packet=16M
wait_timeout = 120
long_query_time = 1
log_slow_queries
log_queries_not_using_indexes
query_cache_limit=2M
query_cache_type=1
query_cache_size=8M
innodb_additional_mem_pool_size=8M
innodb_buffer_pool_size=16M
#innodb_log_file_size=128M
#tmp_table_size=64M
#max_connections = 2500
#max_user_connections = 2500
#innodb_flush_method=O_DIRECT
#key_buffer_size=64M

[mysqld_safe]
mysqld=mysqld.bin

[client]
default-character-set=UTF8
port=3306
socket=/opt/bitnami/mysql/tmp/mysql.sock

[manager]
port=3306
socket=/opt/bitnami/mysql/tmp/mysql.sock
pid-file=/opt/bitnami/mysql/tmp/manager.pid
default-mysqld-path=/opt/bitnami/mysql/bin/mysqld.bin
我注意到,如果删除用于添加行号的外部查询,则时差将降至0.3秒,而不是0.7秒

SELECT shop, shops.shop_id AS
shop_id, p1.product_id AS product_id
    FROM products p1
    INNER JOIN sex ON
    sex.product_id=p1.product_id AND
    sex.sex=0 AND
    sex.date >= (SUBDATE(NOW(),INTERVAL 7 DAY)) INNER JOIN
    shops ON
    shops.shop_id = p1.shop_id 

    ORDER BY shop

尝试使用索引(http://dev.mysql.com/doc/refman/5.1/en/index-hints.html)在中,以及尝试找到使用索引的正确顺序的经验。在大型查询中,mysql通常很难找到正确的索引来使用。

新数据库中的一些索引显示基数0,而在旧数据库中,它们显示的值很大。这可能意味着新数据库对索引的效率有错误的认识。分析该表会更新关于该表所包含的值的信息,以便数据库知道要选择哪个索引

每一张桌子。或者,可以使用单个命令分析所有表:

ANALYZE TABLE products, shops, ...

参考:

索引导出/导入是否正确/完全正确?在DBs和Compare上运行
EXPLAIN SELECT…
是否使用相同的
mysql.ini
文件?表类型是什么?InnoDb是较新版本中的默认值,而MyISAM以前是默认值。@MitchWheat感谢您提醒我添加了解释计划。
ANALYZE TABLE products, shops, ...