IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête supérieure à 2 secondes


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut Requête supérieure à 2 secondes
    Bonjour,

    J'ai beaucoup de requêtes qui prennent plus de 2 sec a la 1ère éxecution, à la 2ème c'est très rapide. Peut'on faire quelque chose pour accélérer ce type de requêtes ? J'ai mis des index dans mes champs de recherche, autre chose a faire ?

    Merci


    # Time: 211221 6:59:12
    # User@Host: phpmyadmin[phpmyadmin] @ localhost []
    # Thread_id: 1015285 Schema: live QC_hit: No
    # Query_time: 2.174280 Lock_time: 0.000123 Rows_sent: 30 Rows_examined: 1228544
    # Rows_affected: 0 Bytes_sent: 11968
    SET timestamp=1640069952;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT title,author,timestamp,url,contents,image  FROM news WHERE  `author` NOT IN ('0AAAAAAAAAAAA')  AND timestamp < CURRENT_TIMESTAMP()  AND bdd_news LIKE 'live.copa_america_Venezuela' ORDER BY `timestamp` DESC LIMIT 0, 30;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE TABLE `news` (
    	`ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
    	`title` VARCHAR(250) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',
    	`url` VARCHAR(350) NOT NULL COLLATE 'utf8mb4_unicode_ci',
    	`timestamp` DATETIME NULL DEFAULT NULL,
    	`contents` TEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
    	`author` VARCHAR(100) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',
    	`author_news` VARCHAR(100) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
    	`bdd_news` VARCHAR(100) NOT NULL COLLATE 'utf8mb4_unicode_ci',
    	`image` VARCHAR(350) NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci',
    	`cat` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',
    	`ts` TIMESTAMP NOT NULL DEFAULT current_timestamp(),
    	`t` TINYINT(1) NOT NULL DEFAULT '0',
    	PRIMARY KEY (`ID`) USING BTREE,
    	UNIQUE INDEX `title_url_bdd_news` (`title`, `url`, `bdd_news`) USING BTREE,
    	INDEX `idx_timestamp` (`timestamp`) USING BTREE,
    	INDEX `idx_author` (`author`) USING BTREE,
    	INDEX `bdd_news` (`bdd_news`) USING BTREE
    )
    COLLATE='utf8mb4_unicode_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=447145650
    ;

  2. #2
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Bonjour omelhor,

    '1228544 rows examined', on sait pourquoi c'est long....

    Questions :
    • NOT IN ('0AAAAAAAAAAAA') à quoi cela correspond exactement ?
    • LIKE 'live.copa_america_Venezuela'...Le LIKE, qui exclut l'emploi d'un index est-il bien nécessaire ?

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut à tous.

    Citation Envoyé par omelhor
    J'ai beaucoup de requêtes qui prennent plus de 2 sec a la 1ère exécution, à la 2ème c'est très rapide.
    C'est normal que la seconde exécution soit plus rapide que la première.
    Dans la seconde exécution, MySql rechercher les résultats qu'il a stocké dans sa mémoire cache.

    Citation Envoyé par omelhor
    Peut-on faire quelque chose pour accélérer ce type de requêtes ?
    Ajouter des index est une des solutions.
    Comme l'indique isabelle.letrong, les deux conditions font que vous n'utilisez pas vos index.
    J'ajouterai aussi la condition sur le timestamp.

    Vos conditions sont non saegable, c'est-à-dire qu'ils n'utilisent pas les index.
    Autrement dit, il y a un balayage de toutes vos lignes.
    C'est la cause de la lenteur de l'exécution de votre requête.

    Voici votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT   title,
             author,
             timestamp,
             url,
             contents,
             image
        FROM news
     
       WHERE `author` NOT IN ('0AAAAAAAAAAAA')
         AND timestamp < CURRENT_TIMESTAMP()
         AND bdd_news LIKE 'live.copa_america_Venezuela'
     
    ORDER BY `timestamp` DESC
       LIMIT 0, 30;
    1) à quoi vous sert de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE `author` NOT IN ('0AAAAAAAAAAAA')
    Que contient la colonne `bdd_news` ?
    Avez-vous plusieurs fois dans votre table le libellé : "live.copa_america_Venezuela" ?
    Je vous conseille d'externaliser cette colonne dans une autre table.
    Ainsi le libellé sera associé à un identifiant numérique.
    Et cet identifiant sera utilisé dans votre table "news" à la place du libellé.
    Pourquoi ? Car les accès seront plus performant.

    L'usage que vous faites de votre timestamp est bizarre.
    A quoi cela vous sert de tester si la date est inférieure à la date du jour ?
    Dois-je comprendre qu'il n'existe pas de date plus grande que la date du jour ?

    Le test sur la colonne "author" est inutile.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Attention : l'opérateur LIKE n'exclut pas toujours l'utilisation d'index

    WHERE ma_colonne like 'chaine%' est sargable* : les index présents sur la colonne ma_colonne sont potentiellement éligibles en fonction du facteur de filtrage
    WHERE ma_colonne like '%chaine' n'est pas sargable, les index ne sont pas éligibles quoi qu'il arrive.

    Pour les autres critères de restriction :

    WHERE `author` NOT IN ('0AAAAAAAAAAAA') est non sargable, aucun index n'est éligible
    AND `timestamp` < CURRENT_TIMESTAMP() est en théorie sargable si un index existe sur la colonne `timestamp', mais, comme il est très peu probable qu'il existe des valeurs de timestamp supérieures au timestamp courant, ce critère n'est dans les faits pas sargable non plus : aucun index ne sera éligible.

    Par ailleurs, il est recommandé d'éviter les noms réservés SQL pour nommer les objets de la base de données.
    TIMESTAMP par exemple est un mot reservé SQL, à éviter comme nom de colonne.

    *SArgAble : Search Argument Able

  5. #5
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.


    C'est normal que la seconde exécution soit plus rapide que la première.
    Dans la seconde exécution, MySql rechercher les résultats qu'il a stocké dans sa mémoire cache.


    Ajouter des index est une des solutions.
    Comme l'indique isabelle.letrong, les deux conditions font que vous n'utilisez pas vos index.
    J'ajouterai aussi la condition sur le timestamp.

    Vos conditions sont non saegable, c'est-à-dire qu'ils n'utilisent pas les index.
    Autrement dit, il y a un balayage de toutes vos lignes.
    C'est la cause de la lenteur de l'exécution de votre requête.

    Voici votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT   title,
             author,
             timestamp,
             url,
             contents,
             image
        FROM news
     
       WHERE `author` NOT IN ('0AAAAAAAAAAAA')
         AND timestamp < CURRENT_TIMESTAMP()
         AND bdd_news LIKE 'live.copa_america_Venezuela'
     
    ORDER BY `timestamp` DESC
       LIMIT 0, 30;
    1) à quoi vous sert de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE `author` NOT IN ('0AAAAAAAAAAAA')
    Que contient la colonne `bdd_news` ?
    Avez-vous plusieurs fois dans votre table le libellé : "live.copa_america_Venezuela" ?
    Je vous conseille d'externaliser cette colonne dans une autre table.
    Ainsi le libellé sera associé à un identifiant numérique.
    Et cet identifiant sera utilisé dans votre table "news" à la place du libellé.
    Pourquoi ? Car les accès seront plus performant.

    L'usage que vous faites de votre timestamp est bizarre.
    A quoi cela vous sert de tester si la date est inférieure à la date du jour ?
    Dois-je comprendre qu'il n'existe pas de date plus grande que la date du jour ?

    Le test sur la colonne "author" est inutile.

    Cordialement.
    Artemus24.
    @+
    En fait dans la colonne "bdd_news" me sers a différencier une "nom de joueur de football" par exemple.
    Et pour 1 "bdd_news" , je peux avoir plusieurs milliers de news ,ce qui explique la volumétrie de la table

    Je vais penser a externaliser cette colonne dans une autre table, merci pour le conseil

    J'ai besoin du test sur la colonne "author", la j'ai mis '0AAAAAAAAAAAA' comme exemple, mais suivant si l'on est sur mobile ou desktop, je peux décider d'afficher un/plusieurs "author" ou pas. Parfois pour une catégorie je n'affiche pas un "author"
    Je vais le gérer autrement, directement dans le php, est exclure les auteurs via une boucle


    je clos le sujet, merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête supérieur ou égale
    Par sam01 dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/11/2018, 20h28
  2. Réponses: 5
    Dernier message: 27/03/2017, 10h51
  3. [PostgreSQL] Requête imbriquée (utiliser valeur d'une première requête dans la seconde)
    Par OliverF dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/11/2016, 00h20
  4. Nombre de requêtes maximum par seconde ?
    Par Mobaladje dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/09/2007, 18h07
  5. IB et Nombre de requêtes par secondes
    Par lio33 dans le forum Débuter
    Réponses: 5
    Dernier message: 15/09/2005, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo