Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1329 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [mySql] conception et performances

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[mySql] conception et performances

n°216295
drlobo
Posté le 18-09-2002 à 13:33:21  profilanswer
 

Voila la situation:
j'ai fait un plugin pour winamp qui affiche les paroles des chansons.
ces paroles sont dans une base mysql, maintenant que la base de données est grosse (160Mo , +130000 enregistrements) j'ai des problemes de performances sur le serveur(utilisation cpu a 100%,requetes lentes) ce qui fait que je me fais regulierement jeté par mes herbergeurs...
 
J'aimerais savoir vous feriez le modele de bdd pour des temps de recherche optimaux.
 
Actuellement la recherche se fait sur l'artiste et le titre (j'ai pas mis l'album pour pas surcharger)
 
dans la premiere version de la base j'avais 3 tables (artist,album,chanson) mais je pense que la cherche avec des jointures c'est pas le plus rapide.
 
J'ai donc tous mis dans une seule table,et là,la recherche est bien plus rapide (2,3x moins de  temps pour faire une recherche).
 
Est ce qu'il est possible de faire quelque chose de mieux(en restant sur mysql)?
 
Sinon je pense aussi utiliser une bdd locale et facile a deployer(sans installer de serveur),qu'est ce qui existe de bien et gratuit?  
 

mood
Publicité
Posté le 18-09-2002 à 13:33:21  profilanswer
 

n°216308
--greg--
Posté le 18-09-2002 à 13:51:18  profilanswer
 

n'oublie pas de mettre des index.
 
sinon euh .. t'as piqué toutes les paroles de purelyrics.com ou quoi?


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
n°216314
Poulou
Posté le 18-09-2002 à 13:57:12  profilanswer
 

1 seule table : bonjour les infos redondantes !...
Sinon comme l'a dit greg, n'oublie pas de mettre des index sur tes champs (artiste et titre dans ton cas).
Tu peux également de temps en temps faire un "OPTIMISE TABLE nomtable" (ou équivalent avec mysqladmin).
Enfin je sais pas comment tu fais tes requêtes mais évite les LIKE c très gourmand en ressource !

n°216336
drlobo
Posté le 18-09-2002 à 14:13:16  profilanswer
 

voila la structure de la table
 

Code :
  1. CREATE TABLE `song` (
  2.   `id` int(11) NOT NULL auto_increment,
  3.   `band` varchar(128) NOT NULL default '',
  4.   `album` varchar(128) default NULL,
  5.   `title` varchar(128) NOT NULL default '',
  6.   `lyrics` longtext NOT NULL,
  7.   `user` varchar(128) default NULL,
  8.   `date_creation` datetime NOT NULL default '0000-00-00 00:00:00',
  9.   `date_modif` datetime default NULL,
  10.   `checked` tinyint(4) NOT NULL default '0',
  11.   UNIQUE KEY `id` (`id`),
  12.   KEY `band` (`band`,`title`),
  13.   FULLTEXT KEY `band_2` (`band`,`title`)
  14. ) TYPE=MyISAM;


 
et voila la requete (y a surement plein de truc a ameliorer de ce coté)
 

Code :
  1. $title=trim($title);
  2. $artist=trim($artist);
  3. switch($sart){
  4. case 1://perfect match
  5.  $artist=" band like '$artist'";
  6.  break;
  7. case 3: //all words
  8.  $tableau=explode(" ",$artist);
  9.  $artist="band like '%$tableau[0]%'";
  10.  for ($i=1;$i<count($tableau);$i++){
  11.   $artist.=" AND band like '%$tableau[$i]%'";
  12.  }
  13.  break;
  14. case 4: //any words
  15.  $tableau=explode(" ",$artist);
  16.  $artist="(band like '%$tableau[0]%'";
  17.  for ($i=1;$i<count($tableau);$i++){
  18.   $artist.=" OR band like '%$tableau[$i]%'";
  19.  }
  20.  $artist.=" )";
  21.  break;
  22. default: //first word
  23.  $artist=" band like '$artist%'";
  24.  break;
  25. }
  26. switch($stit){
  27. case 1://perfect match
  28.  $title="AND title like '$title'";
  29.  break;
  30. case 3: //all words
  31.  $tableau=explode(" ",$title);
  32.  for ($i=0;$i<count($tableau);$i++){
  33.   $title.=" AND title like '%$tableau[$i]%'";
  34.  }
  35.  break;
  36. case 4: //any words
  37.  $tableau=explode(" ",$title);
  38.  $title="(AND (title like '%$tableau[0]%'";
  39.  for ($i=1;$i<count($tableau);$i++){
  40.   $title.=" OR title like '%$tableau[$i]%'";
  41.  }
  42.  $title.=" )";
  43.  break;
  44. default: //first word
  45.  $title="AND title like '$title%'";
  46.  break;
  47. }
  48. $sql ="select band,id,album,title,lyrics,date_creation from song2 where $artist $title LIMIT 0,21";
  49. $check =mysql_query($sql);

n°222810
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 02-10-2002 à 17:15:05  profilanswer
 

aucun interet de mettre un index fulltext si tu utilises pas la syntaxe de mysql pour utiliser l'index fulltext (SELECT ... MATCH ... AGAINST )


---------------
Protèges carnets personnalisés & accessoires pour bébé

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [mySql] conception et performances

 

Sujets relatifs
[php/MySQL] je recherche un forum de ce genreConception : passage d'événement
[MYSQL] De la longueur de la requête et son incidence sur les perfsphp mysql EOF ????
[MySQL] PB avec MySQLdump[MySQL] comment faire avec un between... [ - Job's Done - ]
Mysql et C#Transferer une base Access vers Mysql
[PHP][Mysql] Update d'un champ qui marche po[mysql]Upadte des tables
Plus de sujets relatifs à : [mySql] conception et performances


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR