SQL查询有时会变慢:显示配置文件 - >开盘时间过长

时间:2015-07-09 12:24:05

标签: mysql sql

我注意到有时请求会花费大量时间来运行几秒钟。

我的数据库几乎是空的(所有表上分散了几十个记录) 这个问题会影响任何请求,即使是在10-20记录的表格上进行简单的“选择”也是如此。 因此,在先验中,它不是关于贪婪的特定请求或索引等问题的问题。

我发了好几天没发现问题。

因此,我决定更有条理地工作,我创建了一个非常简单的PHP小页面,其中包含与DB的连接以及4个简单请求的执行(请参阅下文)。我通过多次更新页面来验证运行时间,并且还创建了一个显示配置文件。

此测试的结果我注意到,当其中一个请求显示几秒钟时,问题似乎是打开表格

现在从这个分析我完全不知道它究竟意味着什么以及我应该做出哪些其他测试来确定问题

示例显示个人资料:

  • starting => 0.000007
  • 等待查询缓存锁定=> 0.000003
  • 检查查询缓存以查询=> 0.000026
  • 检查权限=> 0.000003
  • 打开牌桌=> 1.249692
  • 系统锁定=> 0.000013
  • 等待查询缓存锁定=> 0.000040
  • init => 0.000014
  • optimize => 0.000032
  • statistics => 0.000041
  • prepare => 0.000024
  • 等待查询缓存锁定=> 0.000004
  • prepare => 0.000003
  • 将结果存储在查询缓存中=> 0.000014
  • execution => 0.000003
  • 发送数据=> 0.000038
  • end => 0.000005
  • query end => 0.000004
  • 关闭表格=> 0.000012
  • 释放物品=> 0.000055
  • logging slow query => 0.000003
  • 清理=> 0.000043

这是我的测试文件:

try { 

    /* CONNEXION A LA BDD */

$options=array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.ENCODAGEBDD);

    $bdd = new PDO('mysql:host='.BD_SERVEUR.';dbname='.BD_NOM.';',      BD_UTILISATEUR, BD_PASSE, $options);


    /* EXECUTION TEST REQUEST 1 */

$debut = getMicrotime();

    $resultat = $bdd->prepare("SELECT m.*, r.role FROM  t_membres AS m   INNER JOIN     t_roles AS r ON (r.id_role = m.role_id)  WHERE m.login_membre = ?");    
    $resultat->execute(array('test'));

    $fin = getMicrotime();
 $time = $fin - $debut;

    print_r("<strong>requete 1 membre : ".$time."<br></strong>");
    echo "<br>";   

    /* EXECUTION TEST REQUEST 2 */  

 $debut = getMicrotime();

    $resultat = $bdd->prepare("SELECT t.id_taxon, t.taxon, t.permalien, t.taxonomie,    t.titre_page, t.desc_longue, t.titre, t.desc_courte, t.nb_blocs, t.image_taxon, t.parent_id AS  idcat, tc.permalien AS permaliencat, tc.titre AS titrecat, tc.taxonomie AS taxonomiecat,    tc.taxon AS taxoncat FROM  t_taxon AS t   LEFT JOIN t_taxon AS tc ON    (tc.id_taxon=t.parent_id)  WHERE t.permalien = '?' AND t.en_ligne = 1");    

    $resultat->execute(array('blog'));

    $fin = getMicrotime();
 $time = $fin - $debut;  

 print_r("<strong>requete 2 taxon : ".$time."<br></strong>");
    echo "<br>";

    /* EXECUTION TEST REQUEST 3 */ 

    $debut = getMicrotime();

    $resultat = $bdd->prepare("SELECT mp.id_mp FROM t_mp AS mp WHERE    mp.id_membre_dest = ? AND mp.statut_dest = 0 LIMIT 0, 1");   
    $resultat->execute(array(2));

    $fin = getMicrotime();
 $time = $fin - $debut;

    print_r("<strong>requete 3 mp : ".$time."<br></strong>");
    echo "<br>";    

    /* EXECUTION REQUETE 4 */

    $debut = getMicrotime();

    $resultat = $bdd->prepare("SELECT b.id_bloc, b.titre, b.image, b.contenu, b.permalien, b.nb_commentaires, b.date_modif, t.permalien AS permaliencat, t.id_taxon as idcat, t.taxon as taxoncat, t.taxonomie as taxonomiecat, t.titre as titrecat FROM  t_bloc AS b   INNER JOIN t_taxon_bloc as tb ON (tb.id_bloc = b.id_bloc) INNER JOIN t_taxon AS t ON (t.id_taxon=tb.id_taxon)  WHERE b.en_ligne = 1 AND b.date_modif <= '2015-07-08 11:24:05' AND tb.id_taxon= ?   ORDER BY tb.id_bloc DESC  LIMIT 0, 3");   
    $resultat->execute(array(1));

    $fin = getMicrotime();
    $time = $fin - $debut;

    print_r("<strong>requete 4 articles : ".$time."<br></strong>");
    echo "<br>";


}catch (PdoException $e) {            
               exit ;        
}
PS:我在OVH上互相分享。我使用Mysql和引擎Innodb

抱歉我的英语,我是法国人。

更多别致:

谢谢gfunk关于你的兴趣

信息:

1 / EXPLAINS

SELECT m.*, r.role FROM  t_membres AS m   INNER JOIN t_roles AS r ON     (r.id_role = m.role_id)  WHERE m.login_membre = ?
  

id select_type表类型possible_keys键key_len ref行   额外

     

1 SIMPLE m const login_membre,role_id login_membre 47 const 1

     

1 SIMPLE r const PRIMARY PRIMARY 1 const 1

解释

SELECT t.id_taxon, t.taxon, t.permalien, t.taxonomie, t.titre_page, t.desc_longue, t.titre, t.desc_courte, t.nb_blocs, t.image_taxon, t.parent_id AS idcat, tc.permalien AS permaliencat, tc.titre AS titrecat, tc.taxonomie AS taxonomiecat, tc.taxon AS taxoncat FROM  t_taxon AS t   LEFT JOIN t_taxon AS tc ON (tc.id_taxon=t.parent_id)  WHERE t.permalien = '?' AND t.en_ligne = 1
  

id select_type表类型possible_keys键key_len ref行   额外

     

1 SIMPLE t const idx_permalien idx_permalien 302 const 1

     

1 SIMPLE tc const PRIMARY PRIMARY 3 const 1

解释

SELECT mp.id_mp FROM t_mp AS mp WHERE  mp.id_membre_dest = '?' AND
mp.statut_dest = 0 LIMIT 0, 1
  

id select_type表类型possible_keys键key_len ref行   额外

     

1 SIMPLE mp ref id_dest id_dest 5 const,const 1使用索引

解释

SELECT b.id_bloc, b.titre, b.image, b.contenu, b.permalien, b.nb_commentaires, b.date_modif, t.permalien AS permaliencat, t.id_taxon as idcat, t.taxon as taxoncat, t.taxonomie as taxonomiecat, t.titre as titrecat FROM  t_bloc AS b   INNER JOIN t_taxon_bloc as tb ON (tb.id_bloc = b.id_bloc) INNER JOIN t_taxon AS t ON (t.id_taxon=tb.id_taxon)  WHERE b.en_ligne = 1 AND b.date_modif <= '2015-07-08 11:24:05' AND tb.id_taxon= ?   ORDER BY tb.id_bloc DESC  LIMIT 0, 3"
  

id select_type表类型possible_keys键key_len ref行   额外

     

1 SIMPLE t const PRIMARY PRIMARY 3 const 1 NULL

     

1 SIMPLE tb ref PRIMARY,id_bloc PRIMARY 3 const 7使用where;运用   索引

     

1 SIMPLE b eq_ref PRIMARY,en_ligne,idx_datemodif PRIMARY 3   mabdd.tb.id_bloc 1使用where

2 / SHOW CREATE TABLE

CREATE TABLE `t_mp` (
 `id_mp` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `id_membre_exp` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'id  du membre expéditeur, vide lorsqu''il s''agit d''une notification du site',
 `id_membre_dest` int(10) unsigned NOT NULL DEFAULT '0',
 `sujet` varchar(100) NOT NULL,
 `message` text NOT NULL,
 `statut_dest` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '0:non lu; 1 :lu, 2 : répondu, 3: supprimé, 4 : sauvegardé',
 `statut_exp` tinyint(2) unsigned NOT NULL DEFAULT '1' COMMENT '0:non lu; 1 :lu, 2 : répondu, 3: supprimé, 4 : sauvegardé',
 `date_envoi` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `id_mp_parent` bigint(20) unsigned NOT NULL,
 `notification` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0 : non notification; 1: notification',
 PRIMARY KEY (`id_mp`),
 KEY `idx_date` (`date_envoi`),
 KEY `id_mp_parent` (`id_mp_parent`),
 KEY `id_dest` (`id_membre_dest`,`statut_dest`),
 KEY `id_exp` (`id_membre_exp`,`statut_exp`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 


CREATE TABLE `t_membres` (
 `id_membre` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `role_id` tinyint(3) unsigned NOT NULL DEFAULT '2',
 `login_membre` varchar(15) NOT NULL,
 `password_membre` varchar(128) NOT NULL,
 `email_membre` varchar(100) NOT NULL,
 `date_anniversaire` datetime NOT NULL DEFAULT '1900-01-01 00:00:00',
 `cle_activation` varchar(64) NOT NULL,
 `ip_connexion` varchar(100) NOT NULL,
 `description_membre` text NOT NULL,
 `sexe` varchar(1) NOT NULL DEFAULT 'I' COMMENT 'H=Homme, F= Femme, I=Indéterminé',
 `preference_sexe` varchar(1) NOT NULL DEFAULT 'I' COMMENT 'H=Homme, F= Femme, I=Indéterminé',
 `avatar` varchar(25) NOT NULL,
 `url_membre` varchar(200) NOT NULL COMMENT 'URL du blog ou du Site perso du membre',
 `date_inscr_membre` datetime NOT NULL DEFAULT '2014-01-01 00:00:00',
 `date_modif_membre` datetime NOT NULL DEFAULT '2014-01-01 00:00:00' COMMENT 'date de modification de son profil, facebook, url (tous les chmaps pouvant contenir du texte)',
 `date_connexion` datetime NOT NULL DEFAULT '2014-01-01 00:00:00',
 `notification_mail` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 ou 1',
 `accept_mp` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '1 = les membres peuvent le contacter, 0 : aucun membre ne peut le contacter.',
 `statut_membre` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0:non validé; 1=actif; 2=demande de suppression',
 `sanction` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0 : pas de sanction, 1: banni de communication, 2 : banni du site',
 `nb_jours_actifs` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'nombre de jours ou le mebre s''est connecté au site',
 `points_tx` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'points fidelité totatux',
 `points_actuels` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'points fidelité restants après dépense dans une éventuelle boutique....',
 `mode_vacances` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0: pas en vacances, 1 : en vacances',
 `note_interne` varchar(255) NOT NULL,
 `profil_en_ligne` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '0: hors ligne , 1: en ligne, 2 a modérer',
 PRIMARY KEY (`id_membre`),
 UNIQUE KEY `email_membre` (`email_membre`),
 UNIQUE KEY `login_membre` (`login_membre`),
 KEY `date_modif_membre` (`date_modif_membre`),
 KEY `date_connexion` (`date_connexion`),
 KEY `points_tx` (`points_tx`),
 KEY `date_inscr_membre` (`date_inscr_membre`),
 KEY `role_id` (`role_id`),
 KEY `date_anniversaire` (`date_anniversaire`),
 KEY `ip_connexion` (`ip_connexion`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT


CREATE TABLE `t_bloc` (
 `id_bloc` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 `titre` varchar(100) NOT NULL DEFAULT 'A compléter',
 `nom_bloc` varchar(25) NOT NULL COMMENT 'nom jeu/site/logiciel...',
 `contenu` text NOT NULL,
 `titre_page` varchar(100) NOT NULL,
 `desc_courte` varchar(255) NOT NULL,
 `url` varchar(255) NOT NULL,
 `follow_url` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'Affin de pouvoir mettre en nofollow les liens douteux 0=Non;  = oui',
 `image` varchar(120) NOT NULL,
 `video` varchar(120) NOT NULL,
 `note` tinyint(3) unsigned NOT NULL DEFAULT '0',
 `champopt1` text NOT NULL,
 `champopt2` text NOT NULL,
 `permalien` varchar(100) NOT NULL,
 `en_ligne` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0: hors ligne , 1: en ligne, 2 brouilloner',
 `date_crea` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `date_modif` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `nb_commentaires` smallint(5) unsigned NOT NULL DEFAULT '0',
 `nb_jaimes` mediumint(8) unsigned NOT NULL DEFAULT '0',
 `nb_jaimespas` mediumint(8) unsigned NOT NULL DEFAULT '0',
 `pourcentage_jaimes` mediumint(2) unsigned NOT NULL DEFAULT '50',
 `niveau_classement` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'utiliser pour classer des fiches (jeux, sites...) 0 = bof, 1 : bon, 2 : excellent ou régie ou gros partenaires,  3 : très gros coups de coeur ou gros annonceurs ou très gros partenaires',
 `id_bloc_parent` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'Utilisé pour les articles de rubriques annexes (actualité, vidéos etc.)',
 `id_membre_bloc` int(10) unsigned NOT NULL DEFAULT '1' COMMENT 'id du membre qui propose l''article. 0 par défaut',
 `commentaires_actifs` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'champ pour pour pouvoir bloquer les commentaires ou non',
 PRIMARY KEY (`id_bloc`),
 KEY `en_ligne` (`en_ligne`,`date_modif`,`id_bloc`),
 KEY `idx_datemodif` (`date_modif`,`id_bloc`),
 KEY `id_bloc_parent` (`id_bloc_parent`),
 KEY `niveau_classement` (`niveau_classement`),
 KEY `note` (`note`),
 KEY `id_membre_bloc` (`id_membre_bloc`),
 KEY `nom_bloc` (`nom_bloc`),
 KEY `nb_jaimes` (`nb_jaimes`,`pourcentage_jaimes`),
 KEY `pourcentage_jaimes` (`pourcentage_jaimes`,`nb_jaimes`),
 KEY `permalien` (`permalien`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT 


CREATE TABLE `t_taxon` (
 `id_taxon` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 `taxonomie` varchar(25) NOT NULL COMMENT 'categorie, rubrique, tag...',
 `taxon` varchar(50) NOT NULL COMMENT 'Nom du tag court',
 `titre` varchar(100) NOT NULL COMMENT 'Plus de liberté pour le titre',
 `desc_longue` text NOT NULL COMMENT 'Description présente dans la page du tag',
 `desc_courte` varchar(255) NOT NULL COMMENT 'Meta description',
 `titre_page` varchar(100) NOT NULL COMMENT 'Titre présent sur les navigateurs',
 `permalien` varchar(100) NOT NULL COMMENT 'Utilisé pour l''url rewriting',
 `en_ligne` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'en_ligne, hors ligne, noindex...',
 `image_taxon` varchar(255) NOT NULL,
 `date_ajout` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `date_modif` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `parent_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
 `nb_blocs` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'utilisé pour le moment uniquement pour le srubriques et les catégories afin d''alléger les requêtes et éviter certains count',
 PRIMARY KEY (`id_taxon`),
 UNIQUE KEY `idx_taxon` (`taxon`),
 UNIQUE KEY `idx_permalien` (`permalien`),
 KEY `date_ajout` (`date_ajout`),
 KEY `date_modif` (`date_modif`),
 KEY `parent_id` (`parent_id`),
 KEY `taxonomie` (`taxonomie`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT 

3 / CMD

抱歉,我不知道如何在共享主机上运行cmd“iostat -x 1”:/

0 个答案:

没有答案