Я использую mysql 5.5. Моя ОС - Centos7. У меня есть эта простая структура
Create table myContent
(
TheId int PK
Content blob
);
Размер каждого шарика составляет около 100 КБ. Мне нужно оптимизировать
select * from myContent limit N.
Обычно я ставлю N как 50, так что это около 5 МБ. Это занимает около 1 минуты, чтобы получить. Моя скорость inte rnet равна 10 Мбит / с.
Запрос был просто в порядке, пока не произошла эта коронная пандемия c, а мой поставщик inte rnet сильно замедлил inte rnet. Затем я подписался на более высокую скорость до 20 Мбит / с, и мой запрос все еще очень медленный (ограничение 5 строк (500 КБ) занимает более 1 минуты). Я не могу перейти к другому провайдеру inte rnet, потому что это единственный провайдер, который у меня есть в моем регионе.
Я проверил MySQL traffi c, и на самом деле трафик c медленнее, чем обычный. Также нет блокировки таблицы. Есть ли какие-либо другие вещи, которые я могу сделать с MySQL?
РЕДАКТИРОВАТЬ: Я думаю, что мое объяснение не ясно, какова моя цель или что я пытаюсь сделать. Я пытался просто вещи, чтобы это не стало слишком сложным. Я пытаюсь создать данные синхронизации между несколькими локальными серверами, используя очередь. Все серверы расположены в разных областях, и большинство из них использует один и тот же поставщик inte rnet. Мой блоб является результатом сжатых необработанных данных. BLOB-объект создается на каждом сервере, который должен быть загружен другим сервером. Итак, вот моя основная структура:
create table myQueue
(
myQueueId int NOT NULL, -- PK
serverId int DEFAULT NULL, -- this is the ID where the data is from
blobId int DEFAULT NULL, -- the id of my blob table (TheId)
timeupdate datetime, -- current time
PRIMARY KEY (myQueueId),
UNIQUE INDEX blobId (blobId),
INDEX timeupdate(timeupdate)
);
CREATE TABLE downloadedServer (
myQueueId int NOT NULL, -- PK
serverId int(11) NOT NULL, -- PK
serverIdDownloaded int(11) NOT NULL, -- PK
PRIMARY KEY (myQueueId, serverId, serverIdDownloaded)
);
CREATE TABLE myContent
(
TheId int NOT NULL, -- PK
Content blob, -- this is the result of compressed data that is generated from the app that needs to be downloaded by another server. I tried my best so this is the very least amount of size that I can do
PRIMARY KEY (TheId)
);
Каждый день таблица myQueue очищается, поэтому она не будет раздутой. Мой обычный запрос на каждом сервере выглядит следующим образом:
-- Check if there is any data that has to be downloaded
SELECT COUNT(*) FROM myQueue q
WHERE q.serverId != vServerId -- make sure it's not from the same server
AND NOT EXISTS (SELECT 1 FROM downloadedServer d WHERE
d.serverIdDownloaded = vServerId AND
d.myQueueId = q.myQueueId AND
d.serverId = q.serverId);
-- Then I download the content that has to be downloaded using this query.
-- This query gets very slow even I reduced the limit N since my internet provider slows the internet down. The server that subscribed different provider doesn't have this problem.
SELECT q.myQueueId, q.serverId, c.Content
FROM myQueue q
JOIN myContent c ON q.BlobId=c.TheId
WHERE q.serverId != vServerId -- make sure it's not from the same server
AND NOT EXISTS (SELECT 1 FROM downloadedServer d WHERE
d.serverIdDownloaded = vServerId AND
d.myQueueId = q.myQueueId AND
d.serverId = q.serverId)
ORDER BY q.timeupdate LIMIT N;
После загрузки большой двоичный объект распаковывается с только что загруженного сервера. Это происходит каждые 15 минут.
Мой запрос select * из предела myContent 5 предназначен для целей тестирования, поэтому загрузка 500 КБ данных занимает много времени, и мне интересно, как я могу сделать это быстрее при таком медленном соединении.