Posts tagged mysql
Проблем при сравнение на числа с плаваща запетая при MySQL
2Докато работих по един клиентски проблем се оказа, че има проблем при „сравнение“ на числата с плаваща запетая поне при 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 база данни
4Тук ще ви дам няколко съвета за оптимизиране на вашите бази данни за по-добро бързодействие:
- Пишете кои полета искате да вземете при дадена 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). Всичко друго – как се организира, структурира, зависи само от вас
Брояч на онлайн потребители – ООП урок
0Направих един брояч за това колко онлайн потребителя има сега:
Ето таблицата:
CREATE TABLE IF NOT EXISTS `visitors` (
`visit_id` int(11) NOT NULL AUTO_INCREMENT,
`visit_ip` varchar(100) NOT NULL,
`visit_time` int(11) NOT NULL,
PRIMARY KEY (`visit_id`),
KEY `visit_ip` (`visit_ip`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Ето целия php код:
// връзка към база данни
$conn = mysql_connect('localhost', 'root', '');
mysql_select_db('visits', $conn);
//създаваме клас
class Visits {
// Определяме на колко минути искаме да се ъпдейтва брояча
public $maxtime = '5';
/създаваме конструктора. В нашия случай не приема параметри
public function __construct() {
// променливата ip приема ip на посетителя. Примерно 127.0.0.1
$ip = $_SERVER['REMOTE_ADDR'];
// трием всички посетители, които са посетили сайта ни преди повече от 5 минути
$this->RemVisit($ip);
// правим проверка дали съществува това ip в нашата база данни
if ($this->VisitExists($ip)) {
// ако съществува ъпдейтваме времето му
$this->UpdateVisits($ip);
} else {
// ако не съществува добавяме ip и време към базата данни
$this->AddVisit($ip);
}
// визуализираме колко посетителя има в момента
echo 'ima '.$this->ShowVisits().' posetitelq';
}
//създаваме публичен метод AddVisit, която приема параметъра $ip
public function AddVisit($ip) {
// sql заявка за вкарване на ip и време в базата данни
$sql = 'INSERT INTO visitors (visit_ip, visit_time) VALUES ("' . $ip . '",' . time() . ')';
mysql_query($sql);
}
// създаваме публичен метод за премахване на записи в базата данни, където visit_time е минало преди определеното от нас време
public function RemVisit($ip) {
mysql_query('DELETE FROM visitors WHERE visit_time>=' . time() + $this->maxtime * 60);
}
// проверка дали същестува посетител с това ip в базата данни
public function VisitExists($ip) {
$sql = mysql_query('SELECT visit_id FROM visitors WHERE visit_ip="' . $ip . '"');
if (mysql_num_rows($sql) == 1) {
return true;
} else {
return false;
}
}
// публичен метод заа ъпдейт на базата данни
public function UpdateVisits($ip) {
mysql_query('UPDATE visitors SET visit_time=' . time() . ' WHERE visit_ip="' . $ip . '"');
}
// публичен метод за визуализиране на броя посетители (резултатите в базата данни)
public function ShowVisits()
{
$sql=mysql_query('SELECT COUNT(visit_id) as allvisitors FROM visitors');
$rs=mysql_fetch_assoc($sql);
return $rs['allvisitors'];
}
}
// правим инстанция на класа Visits. Понеже сме задали магическия метод __construct няма смисъл да го присвояваме на променлива, после да визуализираме, да викаме методи от него и така нататък
new Visits();