Bonjour,

J'ai un problème curieux avec mySQL; j'ai des tailles utiles très différentes pour 2 tables ayant quasi la même structure/index et nombre de lignes, les tables sont définies ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CREATE TABLE TSENSOR (
DateTime DATETIME NOT NULL,
SensorID TINYINT UNSIGNED,
Value FLOAT,
PRIMARY KEY(DateTime,SensorID));
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CREATE TABLE SENSORS (
DateTime DATETIME NOT NULL,
SensorID SMALLINT UNSIGNED,
Value FLOAT,
PRIMARY KEY(DateTime,SensorID));
La seule difference est SensorID comme TINYINT dans TSENSOR et comme SMALLINT dans SENSORS, seulement 1 octet de plus pour SENSORS normalement.
Les index ont été créés de la même façon:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CREATE INDEX SensorID ON TSENSOR(SensorID);
CREATE INDEX DateTime ON TSENSOR(DateTime);
 
CREATE INDEX SensorID ON SENSORS(SensorID);
CREATE INDEX DateTime ON SENSORS(DateTime);
Cependant, pour un nombre similaire de lignes, la taille des tables est très différente:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT COUNT(*) FROM TSENSOR;
+----------+
| COUNT(*) |
+----------+
| 3308886 |
+----------+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT COUNT(*) FROM SENSORS;
+----------+
| COUNT(*) |
+----------+
| 3581182 |
+----------+

source /home/pi/mysql/dbsize.sql;
+---------+-----------------+----------------+-----------------+
| Table | Total Size (MB) | Data Size (MB) | Index Size (MB) |
+---------+-----------------+----------------+-----------------+
| SENSORS | 511 | 390 | 121 |
| TSENSOR | 111 | 61 | 50 |
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
dbsize.sql is as follows:
SELECT
TABLE_NAME AS `Table`,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Total Size (MB)`,
ROUND((DATA_LENGTH) / 1024 / 1024) AS `Data Size (MB)`,
ROUND((INDEX_LENGTH) / 1024 / 1024) AS `Index Size (MB)`
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = "t_monitoring"
ORDER BY
(DATA_LENGTH + INDEX_LENGTH)
DESC;
En gros chaque enregistrement dans TSENSOR occupe environ 34 octets alors qu'il en occupe environ 154 dans SENSORS.
Les données ont été dupliquées de TSENSOR dans SENSORS de la façon suivante (je ne pense pas que cela ait de l'importance mais sait-on jamais):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
INSERT INTO SENSORS (DateTime,SensorID,Value)
SELECT DateTime,1000+SensorID,Value
FROM BSENSOR;
 
INSERT INTO SENSORS (DateTime,SensorID,Value)
SELECT DateTime,SensorID,Value
FROM TSENSOR;
Quelqu'un a une explication?
Jean