|
|
|
| Здравствуйте.
Данный вопрос является достаточно сложным для меня, поэтому прощу помощи у опытных программистов.
Сут в следующем:
Есть такие запросы (встречаются они на разных старницах):
SELECT * FROM payment WHERE wait = 1 and status != 3
SELECT * FROM payment WHERE id_partner = $id and summa != 0
SELECT * FROM payment WHERE status = 0
SELECT count(*) FROM payment WHERE wait = 2 and status != 0
|
Как в этом случае использовать индексы?
Можно ли так:
Это решит проблему оптимизации, если таблица будет модержать несколько десятков тысяч записей?
KEY multi (wait, status) поле статус используется и здесь
KEY new (status) и здесь. Это допустимо?
KEY multi2 (id_partner, summa)
|
Какого придела стоит придерживаться по количеству SELECT запросов на странице?
У меня обячно бывает 2 -а разных запроса, например такие:
SELECT * FROM partner WHERE login = '$login' AND password = '$password'
SELECT * FROM message WHERE status = 1
|
Это допустимо?
Пожалуйста, подскажите, мне решение проблемы.
Я очень надеюсь на Вашу помощь.
Заранее большое Вам спасибо | |
|
|
|
|
|
|
|
для: webwizard
(01.04.2008 в 16:28)
| | У вас тормозит система? | |
|
|
|
|
|
|
|
для: cheops
(02.04.2008 в 00:09)
| | Нет, система не тормозит, на локальном хосте всё работает нормально, но ведь если база данных будет очень большая, то будут перегрузки на сервере и сайт могут оключить.
Cheops, подскажите, пожалуйста, по моему вопросу, Вы профессионал, у меня много Ваших книг, но подобных ситуаций я там не нашёл.
И вот ещё такой вопрос, что лучше использовать:
такой запрос (удаление данных для пользователя в двух таблицах):
DELETE FROM partner WHERE id_user = $id
DELETE FROM payment WHERE id_partner = $id
|
или многотабличное удаление:
DELETE partner, payment FROM partner, payment
WHERE partner.id_user = $id and payment.id_partner = $id
|
Что быстрее будет выполняться?
Как можно узнать скорость выполнения запросов?
Пожалуйста, подскажите.
Я считаю, что вопрос оптимизации база дынных это очень серьёзный вопрос и я бы купил Вашу книгу (напишите, пожалуйста,) даже за 1000 рублей. | |
|
|
|
|
|
|
|
для: webwizard
(02.04.2008 в 06:42)
| | Cheops, ответьте, пожалуйста. | |
|
|
|
|
|
|
|
для: webwizard
(02.04.2008 в 06:42)
| | Если хочется сравнить скорость выполнения запросов, то можете воспользоваться функцией BENCHMARK().
Только не забывайте о том, что выиграв в скорости на mysql, вы наверняка проиграете в PHP. А на преждевременную оптимизацию еще потратите силы и время.
Если ваш код будет сильно нагружать сервер, то хостер вам об этом первому сообщит, вот тогда и надо начинать чесаться. Кроме того, сильно оптимизированный код, зачастую, очень трудно читать, а значит сопровождать. Так что в нынешних условиях часто дешевле докупить еще один сервер, чем посадить программиста оптимизировать код. | |
|
|
|
|
|
|
|
для: Loki
(02.04.2008 в 19:13)
| | Спасибо за ответ, но всё же Вы бы не могли мне прояснить ситуацию по моему вопросу насчёт индексов.
Достимо ли использовать приведённые выше комбинаций, будет ли это эффективно, чем вообще отсутствие таковых? | |
|
|
|
|
автор: rusty_angel (04.04.2008 в 10:12) |
|
|
для: Loki
(02.04.2008 в 19:13)
| | Каким образом можно проиграть в скорость PHP, создав правильные индексы? | |
|
|
|
|
|
|
|
для: webwizard
(02.04.2008 в 06:42)
| | Здесь лучше всегда использовать однотабличные запросы, многотабличные запросы сильно затормаживаются при росте базы данных. | |
|
|
|
|
|
|
|
для: webwizard
(01.04.2008 в 16:28)
| | 1) В принципе да, вам придётся для каждого из запроса создавать ключи, которые комбинируют поля, участвующие в WHERE-условии.
2) Какого придела стоит придерживаться по количеству SELECT запросов на странице?
Ограничивать себя специально не нужно - иначе код усложните и вероятность совершения ошибки возрастёт. Используя постраничную навигацию, индексирование, извлечение информации и помещение её в сессию можно здорово улучшить производительность. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2008 в 11:39)
| | Спасибо, большое, Cheops.
Я жду от Вас новых книг и желательно объёмных, вообще очень нужно что-то про оптимизацию кода как на php так и при использовании php+mysql
У Вас здоровские книги я советую всем!
Я надеюсь стать таким же профи как и Вы | |
|
|
|
|
|
|
|
для: webwizard
(03.04.2008 в 13:52)
| | А скажите, пожалуйста, имеет ли значение порядок следования индексов?
т.е.
KEY multi (wait, status)
KEY multi (status, wait)
|
В коде страничек встречается и так и так:
SELECT * FROM payment WHERE wait = 1 and status != 3
SELECT * FROM payment WHERE status != 3 and wait != 1
1.Стоит ли приводить всё к одному порядку?
2. Влияет ли как-нибудь на индексы использование конструкций OR, ORDER BY (DESC), GROUP BY и т.п.
3. Как я понимаю, использование многотабличных запросов стоит избегать, если база данных большая? | |
|
|
|
|
автор: rusty_angel (04.04.2008 в 10:22) |
|
|
для: webwizard
(03.04.2008 в 14:54)
| | 1. Для WHERE ... AND ... особой разницы не заметил на тестах (не очень правда, адекватных, надо будет как-нибудь настоящее тестирование провести, по всем правилам). В любом случае, это точно не первое, на что следует обращать внимание, если есть проблемы с производтельностью.
2. Естественно, индексы используются для ORDER и GROUP BY. Какие именно - EXPLAIN расскажет.
3. Не стоит. Если что медленно, то не потому, что запросы "многотабличные", а потому что они плохие и таблицы плохие. | |
|
|
|
|
|
|
|
для: rusty_angel
(04.04.2008 в 10:22)
| | А что значит "плохие запросы"? "Плохие таблицы"?
И на что следует обращать внимание при низкой производительности?
Вроде в моём случае запросы вполне нормальные. Да и таблица содержит всего 7 полей, причём 6-ть из них хранят числовые типы данных, а как мне извество, они выполняются быстрее, чем, строковые типы данных.
Мне кажется как раз в первую очередь на правильное использование индексов. | |
|
|
|
|
|
|
|
для: webwizard
(04.04.2008 в 10:28)
| | есть такая команда в мускуле explain - используется перед селектом и показывает как мускул будет обрабатывать вашь запрос
http://www.mysql.ru/docs/man/EXPLAIN.html
очччень полезная команда именно в смысле оптимизации запросов | |
|
|
|
|
|
|
|
для: KirillKiev
(04.04.2008 в 10:42)
| | Спасибо за ответ.
Мне знакома данная команда, но я хотел разобраться с тонкостью использования индексов. | |
|
|
|
|
|
|
|
для: webwizard
(04.04.2008 в 11:09)
| | Она как раз и позволяет проверить используются индексы или нет. | |
|
|
|
|
|
|
|
для: cheops
(04.04.2008 в 11:24)
| | Спасибо всем за ответы. Очень помогли. | |
|
|
|
|
автор: rusty_angel (04.04.2008 в 14:46) |
|
|
для: webwizard
(04.04.2008 в 11:09)
| | С тонкостями - только опыт наверно. Во всяком случае - точно не тема на форуме, а очень серьёзная книга, а лучше две. Одна о базах данных вцелом, и одна о mysql. А так - да, натравливать на подозрительные запросы EXPLAIN. | |
|
|
|