Сделайте MySQL запрос быстрее - PullRequest
1 голос
/ 26 ноября 2011

Мне нужно сделать этот запрос быстрее и нужна помощь.

Код:

sqlFrom = "FROM tx_apartment_buy a where result_id" + 
"not in (select result_id from tx_user_view2" + 
"where product_type='apartmentBuy'" + 
 "and  date_published>='"+yesterdayDate+"' and user_list like '%;"+uid +";%')";

if(StringUtility.isSet(userSql)) {
  sqlFrom+=" AND "+userSql;
}

sqlFrom+=" and a.source=? order by batch_no desc," + 
"a.date_created asc, a.order_no limit 0,15";
sql = "SELECT * " + sqlFrom;

insertSql = "INSERT INTO tx_user_view2 " + 
"(result_id, date_created, product_type, user_list) " +
"SELECT result_id, SYSDATE(), '"+product+"', ';"+uid+";\r\n'" + sqlFrom;

insertSql += " ON DUPLICATE KEY UPDATE user_list = CONCAT(user_list, VALUES(user_list))";

Ответы [ 3 ]

1 голос
/ 26 ноября 2011

Я не могу сказать или настроить этот запрос для вас. Но я рекомендую вам создать окончательный запрос, взглянув на план объяснения. План объяснения скажет вам, используются ли индексы, сколько сканирований строк вы выполняете и, возможно, вы можете начать с этого. Для объяснения запроса выполните

explain select * from dummy_table where x = 'abcd' and y like '%dfs% 
       and z not in ('ab','cd','ef')

Плюс, лучше, чтобы у вас не было запросов с %like%, поскольку он никогда не будет попадать в индексы.

Производительность запросов будет улучшаться, если вы используете хранимую процедуру. Прикладной уровень отделен от уровня базы данных. Хранимые процедуры являются родными для баз данных. Например, если вы хотите выполнить итерацию по запросу select, содержащему 10000 строк, вы можете сделать это как с помощью приложения, так и с помощью хранимой процедуры. Недостаток выполнения этого на прикладном уровне заключается в том, что вам придется приводить записи в блоках (JDBC плавно делает это для вас, используя объект набора результатов), должна происходить какая-то передача данных. Это связано с задержкой в ​​отношении размера памяти, скорости передачи ч / б приложения и дБ и т. Д.

Принимая во внимание, что когда вы делаете это в хранимой процедуре, память является локальной для базы данных, и вся обработка может выполняться там. Я не говорю, что вы должны полностью изолировать прикладной уровень от базы данных, но все же SP гораздо лучше, особенно когда вы имеете дело с огромными записями и сложными запросами.

0 голосов
/ 26 ноября 2011

Если вы можете избежать вложенного запроса select и использовать вместо него левое соединение. Особенно левое объединение может быть полезно для модели смежного дерева или отношения родитель-потомок.

0 голосов
/ 26 ноября 2011

Избегайте строительства String с нуля. Используйте подготовленные операторы, хранимые процедуры, а также добавьте индекс в свою базу данных.

...