[mySql] conception et performances

conception et performances [mySql] - SQL/NoSQL - Programmation

Marsh Posté le 18-09-2002 à 13:33:21    

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?  
 

Reply

Marsh Posté le 18-09-2002 à 13:33:21   

Reply

Marsh Posté le 18-09-2002 à 13:51:18    

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!
Reply

Marsh Posté le 18-09-2002 à 13:57:12    

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 !

Reply

Marsh Posté le 18-09-2002 à 14:13:16    

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);

Reply

Marsh Posté le 02-10-2002 à 17:15:05    

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é
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed