Je suis en ce moment en train de programmer un système en php/mysql me permettant d'automatiser un calcul de matrices de flux en faisant des cohortes réelles.
Tout fonctionne bien jusqu'à un type de requête précis :
Sur la base 'flux', deux tables, bea1994_flux, en gros 380 000 lignes, et ext1993_flux, en gros 55 000 lignes.
La requête suivante passe très bien sous ACCESS et demande environ 30 secondes de calcul :
Code : Tout sélectionner
SELECT bea1994_flux.ine, ext1993_flux.ine FROM bea1994_flux INNER JOIN ext1993_flux ON bea1994_flux.ine=ext1993_flux.ine GROUP BY bea1994_flux.ine, ext1993_flux.ineSur des tables d'essai de 450 lignes, tout se passe bien. Mais sur les tables réelles, tout plante, dès que la clause 'INNER JOIN' entre en jeu.
J'ai reproduit la chose en ligne de commande, et j'obtiens le message suivant après environ 30 secondes :
'error 2013 : la connexion au serveur mysql a été perdue pendant la requête'.
Si je demande une autre opération, il me sort :
'error 2006 : la connexion est perdue'.
Là, MySql se reconnecte et me donne un nouvel identifiant de connexion.
Pendant ce temps, l'ordinateur - sous Windows XP pro, un Pentium 4 2,2GHz avec 512Mo de RAM - plante complètement, évidemment, comme si la requête continuait à tourner dans le vide.
Je me suis dit qu'il pouvait s'agir de limitations des paramétrages par défaut, et ai donc procédé comme suit :
Code : Tout sélectionner
# mysql config file.
# Copy this file to c:\my.cnf to set global options
#
# One can use all long options that the program supports.
# Run the program with --help to get a list of available options
# This will be passed to all mysql clients
[client]
#password=my_password
port=3306
#socket=MySQL
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# The MySQL server
[mysqld]
skip-innodb
bind-address=127.0.0.1
port=3306
#socket=MySQL
skip-locking
set-variable = key_buffer=64M
set-variable = max_allowed_packet=1000M
set-variable = thread_stack=256K
set-variable = table_cache=256k
set-variable = sort_buffer=4M
set-variable = net_buffer_length=8K
server-id = 1
# Uncomment the following if you want to log updates
#log-bin
# Uncomment the following rows if you move the MySQL distribution to another
# location
basedir = C:/Program Files/EasyPHP1-7/mysql/
datadir = C:/Program Files/EasyPHP1-7/mysql/data/
# Uncomment the following if you are NOT using BDB tables
#skip-bdb
# Uncomment the following if you are using Innobase tables
#innodb_data_file_path = ibdata1:100M
#innodb_data_home_dir = c:\ibdata
#innodb_log_group_home_dir = c:\iblogs
#innodb_log_arch_dir = c:\iblogs
#set-variable = innodb_mirrored_log_groups=1
#set-variable = innodb_log_files_in_group=3
#set-variable = innodb_log_file_size=5M
#set-variable = innodb_log_buffer_size=8M
#innodb_flush_log_at_trx_commit=1
#innodb_log_archive=0
#set-variable = innodb_buffer_pool_size=16M
#set-variable = innodb_additional_mem_pool_size=200M
#set-variable = innodb_file_io_threads=4
#set-variable = innodb_lock_wait_timeout=50
[mysqldump]
quick
set-variable = max_allowed_packet=160M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[isamchk]
set-variable = key_buffer=64M
set-variable = sort_buffer=4M
[myisamchk]
set-variable = key_buffer=64M
set-variable = sort_buffer=4M
[mysqlhotcopy]
interactive-timeout
*********************************
Code : Tout sélectionner
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 30000
Code : Tout sélectionner
MySQL Support enabled
Active Persistent Links 0
Active Links 0
Client API version 3.23.49
Directive Local Value Master Value
mysql.allow_persistent On On
mysql.connect_timeout -1 -1
mysql.default_host no value no value
mysql.default_password no value no value
mysql.default_port no value no value
mysql.default_socket no value no value
mysql.default_user no value no value
mysql.max_links Unlimited Unlimited
mysql.max_persistent Unlimited Unlimited
mysql.trace_mode Off Off
Le error.log d'Apache ne signale rien. Je n'ai pas de log mysql. Pas d'erreur non plus dans le log Eaysy.php.
Mes versions : Apache 1.3.27, PHP 4.3.3, MySQL 4.0.15
On dirait que le serveur mySql n'est pas paramétré pour accepter des tables trop grosses, alors que je sais que ce système est tout de même sensé accepter de travailler sur des systèmes lourds...
Auriez-vous une idée pour me sortir de la panade ? Là je sèche...
Merci pour votre aide,
cordialement,
MyNight