Проблем при сравнение на числа с плаваща запетая при MySQL

Докато работих по един клиентски проблем се оказа, че има проблем при “сравнение” на числата с плаваща запетая поне при MySQL. Може и да не е проблем, но някои хора може да се сблъскат с този проблем.
Да кажем, че искате да направите сайт за аукциони и искате да има графа “аукциони от 1 стотинка”. Това означава, че искате да вземете всички аукциони, които имат начална цена 0.01.
Обикновено вие (както и аз) бихте направили това:
SELECT * FROM auctions WHERE auction_start_price=0.01
Далеч не ви препоръчвам да си пишете така заявките, но това е друг въпрос. Реално няма да има никакви резултати дори в auctions.auction_start_price да има 0.01 в някои от редовете. Затова ще променим заявката така:
SELECT * FROM auctions WHERE ROUND(auction_start_price,2)=0.01
Сега всичко ще е наред. Друго решение е просто да посочите, че auction_start_price<0.02 и всичко щеше да е ок, но в някои случаи, ще е по-добър вариант закръглянето :)

Оптимизиране на вашата MySQL база данни

Тук ще ви дам няколко съвета за оптимизиране на вашите бази данни за по-добро бързодействие:

– Пишете кои полета искате да вземете при дадена SELECT заявка:

Примерно пишете SELECT product_id, product_price, product_name FROM products вместо SELECT * FROM products

– Използвайте колкото се може по-малко функции в дадена заявка

Не използвайте много функции, освен, ако не е супер наложително.

– Иползвайте индекс (index)

Индексите значително подобряват скоростта. Когато имате полета от дадена таблица, които участват често в WHERE клауза, им сложете по един index. Няма точна граница, но нека не са прекалено много. Ако предимно ще ъпдейтвате, триете, добавяте иформация във вашата база данни, то повечето индекси може да я забавят.

– Определяйте добре типовете данни

Примерно опделяйте добре дали дадено поле ще е int, tinyint, smallint, bigint, mediumint. Ако примерно дадено поле ще приема стойности от рода на от 0 до 25 то е хубаво това поле да е tinyint, тъй като приема стойности от -128 до +128, а по-големи числа няма да са ви нужни.

– Не правете подзаявки

Много често се случва, че вместо подзаявка, можете да направите всичко с 1 заявка и в допълнение JOIN.

– Вместо търсене с “Like” ползвайте Full-Text Search

С големи количества данни like работи изключително бавно. Сами по себе си двете търсения се различават. За да добиете по-добра представа е добре да прочетете документациите и на двете.

Тъй като е малко късно и ме мързи да пиша повече, това ще е засега. Скоро се предполага, че ще напиша още малко за оптимизиране на MySQL базите данни (наблягам на MySQL). Всичко друго – как се организира, структурира, зависи само от вас :)