Оптимизировать mysql Blob при медленном соединении - PullRequest
0 голосов
/ 14 апреля 2020

Я использую 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 КБ данных занимает много времени, и мне интересно, как я могу сделать это быстрее при таком медленном соединении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...