Назад | Перейти на главную страницу

База данных MySQL очень медленная, с очень большой таблицей

У меня есть таблица MySQL со 150 миллионами строк. Ниже представлена ​​его структура данных.

Ниже приведены некоторые его данные.

Теперь, используя PHP My Admin, я выполнил следующую команду.

SELECT `iwords` FROM `wordstable` WHERE `iwebs` = "a1" 

В нем говорится, что для выполнения запроса потребовалось меньше секунды. Ниже приводится доказательство.

Но на самом деле мне потребовалось около 1 минуты, чтобы отобразить данные !!

Итак, я запустил код Java, чтобы посмотреть время. Это ниже.

public void select(String str) 
{
    try {
        long startTime = System.currentTimeMillis();
        Statement s = con.createStatement();
        ResultSet executeQuery = s.executeQuery("SELECT `iwords` FROM `wordstable` WHERE `iwebs` = \"a1\" ");
        int r=0;
        long endTime = System.currentTimeMillis();
        System.out.println("Time took by Database: "+(endTime-startTime));
        
        while(executeQuery.next())
        {
            r++;
        }
        
        
        System.out.println("Number of rows: "+String.valueOf(r));
        
    } catch (SQLException ex) {
       ex.printStackTrace();
    }
    
}

Этот код напечатал время как 88779 миллисекунд, что составляет 88,779 секунды!

Это очень большая проблема, у меня есть массив слов для поиска, и если поиск «единственного» слова занимает 88 секунд, это было бы бесполезно!

Ниже приведены некоторые подробности моей таблицы высокого уровня.

Ниже приведены сведения о серверной машине.

Итак, мой вопрос: действительно ли MySQL выполняет эту работу? Согласно MySQL, для обработки запроса потребовалось меньше секунды, но почему на самом деле это занимает так много времени? Моя будущая база данных будет больше, чем эта, миллиарды записей. Мне нужно выполнить эту операцию как минимум за 2-3 секунды!

Обновить

По просьбе члена SO я выполнил приведенную ниже команду и публикую их результаты.

Ввод ОБЪЯСНИТЬ ВЫБРАТЬ iwords ИЗ wordstable ГДЕ iwebs = 'a1';

Результат

Ввод

SET profiling=1;
SELECT iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;

Вывод

Наконец, я обращаюсь к этому серверу с помощью удаленного рабочего стола, но весь код и все остальное выполнялись внутри сервера.

У вас есть какие-нибудь индексы по этой таблице?

Пожалуйста, опубликуйте вывод:

EXPLAIN SELECT iwords FROM wordstable WHERE iwebs = 'a1';

Затем опубликуйте вывод следующего набора команд:

SET profiling=1;
SELECT iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;

Это скажет вам, где находится MySQL, и тогда вы, по крайней мере, будете знать, с чего начать.

ОБНОВИТЬ:

После просмотра вашего обновленного вопроса я не знаю, почему MySQL не может найти подходящий ключ для выполнения вашего запроса. Насколько обширен набор ценностей, который может содержать iwebs? Ваши длительности явно взяты из кеша. Вы должны сбросить кеш запросов MySQL через

RESET QUERY CACHE;

если у вас есть права на перезагрузку, иначе вы должны использовать

FLUSH QUERY CACHE;

Если вы тоже не можете выполнить эту команду, вам придется перезапустить экземпляр сервера MySQL.

Повторно запустите свои команды с флагом SQL_NO_CACHE, как сказал Небу, просто чтобы убедиться, что он не мешает.

Так:

EXPLAIN SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';
SET profiling=1;
SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';
SHOW profile;

Думаю, запрос кешируется. Пытаться

SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1';

Это даст лучшее представление о том, сколько времени требуется для выполнения запроса. Также убедитесь, что веб-сайты проиндексированы. И последнее, чтобы действительно ускорить ваши запросы, сохраните таблицу в памяти:

СОЗДАТЬ ТАБЛИЦУ ii_table (....) ДВИГАТЕЛЬ = ПАМЯТЬ ПО УМОЛЧАНИЮ = utf8

Хранение таблицы в памяти имеет некоторые последствия. Например, каждый раз, когда сервер mysql останавливается, информация таблицы исчезает. Лично для таких ситуаций я создаю две таблицы. Одна таблица памяти, в которой выполняются запросы, и одна таблица на диске. Когда mysql запускается, он загружает таблицу дисков в память.