2015-01-04 301 views
0

我有我的数据库中有61K行mysql,我试着做一个计数,但查询需要4秒,我认为它太多了。计数查询需要很多时间

select count(distinct appeloffre0_.ID_APPEL_OFFRE) 
from ao.appel_offre appeloffre0_ 
inner join ao.lot lots1_ on appeloffre0_.ID_APPEL_OFFRE=lots1_.ID_APPEL_OFFRE 
inner join ao.lieu_execution lieuexecut2_ on appeloffre0_.ID_APPEL_OFFRE=lieuexecut2_.appel_offre 
inner join ao.acheteur acheteur3_ on appeloffre0_.ID_ACHETEUR=acheteur3_.ID_ACHETEUR 
inner join ao.ao_activite aoactivite4_ on appeloffre0_.ID_APPEL_OFFRE=aoactivite4_.ID_APPEL_OFFRE 

我的查询结果:

+----------------------------------------------+ 
| count(distinct appeloffre0_.ID_APPEL_OFFRE) | 
+----------------------------------------------+ 
|          61100 | 
+----------------------------------------------+ 
1 row in set (4.35 sec) 

为什么explain CMD表appeloffre0_使用关键appel_offre_ibfk_2这是对FK列ID_ACHETEUR一个指数?

+----+-------------+--------------+--------+----------------------------+--------------------+---------+--------------------------------+-------+--------------------------+ 
| id | select_type | table  | type | possible_keys    | key    | key_len | ref       | rows | Extra     | 
+----+-------------+--------------+--------+----------------------------+--------------------+---------+--------------------------------+-------+--------------------------+ 
| 1 | SIMPLE  | appeloffre0_ | index | PRIMARY,appel_offre_ibfk_2 | appel_offre_ibfk_2 | 4  | NULL       | 60031 | Using index    | 
| 1 | SIMPLE  | acheteur3_ | eq_ref | PRIMARY     | PRIMARY   | 4  | ao.appeloffre0_.ID_ACHETEUR |  1 | Using index    | 
| 1 | SIMPLE  | lieuexecut2_ | ref | fk_ao_lieuex    | fk_ao_lieuex  | 4  | ao.appeloffre0_.ID_APPEL_OFFRE |  1 | Using index    | 
| 1 | SIMPLE  | aoactivite4_ | ref | ao_activites_ao_fk   | ao_activites_ao_fk | 4  | ao.lieuexecut2_.appel_offre |  3 | Using where; Using index | 
| 1 | SIMPLE  | lots1_  | ref | FK_LOT_AO     | FK_LOT_AO   | 4  | ao.lieuexecut2_.appel_offre |  5 | Using where; Using index | 
+----+-------------+--------------+--------+----------------------------+--------------------+---------+--------------------------------+-------+--------------------------+ 
5 rows in set (0.00 sec) 

节目从appel_offre

+-------------+------------+--------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table  | Non_unique | Key_name   | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------------+------------+--------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| appel_offre |   0 | PRIMARY   |   1 | ID_APPEL_OFFRE  | A   |  60953 |  NULL | NULL |  | BTREE  |   |    | 
| appel_offre |   1 | appel_offre_ibfk_1 |   1 | ID_APPEL_OFFRE_MERE | A   |   2 |  NULL | NULL | YES | BTREE  |   |    | 
| appel_offre |   1 | appel_offre_ibfk_2 |   1 | ID_ACHETEUR   | A   |   2 |  NULL | NULL |  | BTREE  |   |    | 
| appel_offre |   1 | appel_offre_ibfk_3 |   1 | USER_SAISIE   | A   |   2 |  NULL | NULL | YES | BTREE  |   |    | 
| appel_offre |   1 | appel_offre_ibfk_4 |   1 | USER_VALIDATION  | A   |   2 |  NULL | NULL | YES | BTREE  |   |    | 
| appel_offre |   1 | ao_fk_3   |   1 | TYPE_MARCHE   | A   |   2 |  NULL | NULL | YES | BTREE  |   |    | 
| appel_offre |   1 | ao_fk_5   |   1 | USER_CONTROLE  | A   |   2 |  NULL | NULL | YES | BTREE  |   |    | 
+-------------+------------+--------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
7 rows in set (0.03 sec) 
  1. 如何使用指数跑得快数查询索引?

  2. 如何在我们有多个连接时使用索引?

  3. 如何使用索引当我们有多个连接和多个搜索 查询?

回答

2

而是在数使用distinct的尝试更换你的1对多内与exists条件加入。

例如,如果lot.ID_APPEL_OFFRE不是唯一的,然后取出内部联接

inner join ao.lot lots1_ on appeloffre0_.ID_APPEL_OFFRE=lots1_.ID_APPEL_OFFRE 

,并添加您的where子句中的存在状态

where exists (select 1 from ao.lot lots_1 where appeloffre0_.ID_APPEL_OFFRE=lots1_.ID_APPEL_OFFRE) 
+1

感谢@FuzzyTree它减少我的时间0.7秒,你能回答我的2点和3点吗?因为我将使用多重连接的多标准搜索。如果可以的话,你可以给我一个很好的答案。 – Youssef

+0

@Youssef根据你的解释输出,它看起来像你已经正确地使用索引与您的多个加入/其中条件 – FuzzyTree

+0

似乎在添加一些where子句后需要时间再次检查它在这里http://stackoverflow.com/questions/ 27784778 /慢计数查询与-where子句 – Youssef