У меня есть таблица 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 секунды!
update
По запросу члена SO я выполнил следующую команду и публикую их результаты.
Вход EXPLAIN SELECT iwords FROM wordstable WHERE 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';
Это даст лучшее представление о том, сколько времени требуется для выполнения запроса. Также убедитесь, что веб-сайты проиндексированы. И последнее, чтобы действительно ускорить ваши запросы, сохраните таблицу в памяти:
CREATE TABLE ii_table
(....) ENGINE = MEMORY DEFAULT CHARSET = utf8
Хранение таблицы в памяти имеет некоторые последствия. Например, каждый раз, когда сервер mysql останавливается, информация таблицы исчезает. Лично для таких ситуаций я создаю две таблицы. Одна таблица памяти, в которой выполняются запросы, и одна таблица на диске. Когда mysql запускается, он загружает таблицу дисков в память.