لینک کوتاه
یکشنبه , 17 آذر 1398
0 دیدگاه
احتمالا اگر با دیتابیس هایی مثل mysql کار کرده باشید با یک auto increment ساده میتونید فیلد های id رو بصورت auto increment مقدار دهی کنید که خب خیلی عالیه اما توی postgresql معمولا فیلد رو از نوع serial میسازن و خود pg زحمت ساخت یک sequence رو برامون میکشه و الباقی داستان !!
یکی از دوستان توی گروه میخواست به روش mysql اینکارو انجام بده و خب بلطبع راه کارش استفاده از یک تریگر هست !
خب ما یک جدول میسازیم با دو تا فیلد که یکیش id از نوع integer هست .
میتونید روی این فیلد هم index unique بذارید .
-- create table
CREATE TABLE "tbl" (
"id" integer,
"title" character varying(255)
);
کاری که باید انجام بدیم ساخت یک تریگر هست که زمانی که یک insert داخل این جدول رخ میده ، max(id) رو در بیاره و +1 بکنه و برای رکورد جدید اعمال بکنه
-- create function
create or replace function id_increment_tbl()
returns trigger as
$BODY$
DECLARE
an_integer int4 ;
begin
select (max(id)::integer + 1) into an_integer from tbl ;
if an_integer IS NULL then
an_integer:=1;
end if;
NEW.id := an_integer;
return NEW;
end;
$BODY$
LANGUAGE plpgsql;
-- create trigger
CREATE TRIGGER idincrementTrigger
BEFORE INSERT
ON tbl
FOR EACH ROW
EXECUTE PROCEDURE id_increment_tbl();
و حالا تست میکنیم
insert into tbl(title) values ('test');
لینک کوتاه
سه شنبه , 25 اسفند 1394
4 دیدگاه
پارتیشن بندی اساسا در دیتاهای بزرگ سبب افزایش سرعت (قابل ملموس) دستورات SELECT میشود.
و همانطور که از اسمش پیداست براین اساس هست که رکوردهای یک جدول را به چندین پارت کوچکتر تقسیم میکند و براساس نوع تقسیم بندی فقط در یک یا چند پارت کوچکتر عملیات جستجو را انجام میدهد که این نتیجه خوبی در دیتاهای بارکورد بالا خواهد داشت ، دیتابیس هایی چون MySQL و MSSQL چنین قابلیتی رو دارا هستند که بسادگی پارتیشن بندی در آنها ایجاد کرد اما برای PostgreSQL کمی داستان متفاوت است. در حقیقت پارتیشن بندی در PostgreSQL با قابلیت وراثت جداول از یکدیگر قابل پیاده سازی میباشد به این ترتیب که یک جدول مادر ساخته میشود و جدولهای فرزند متعدد (که بعنوان پارت های جدا هستند) از جدول مادر ارث بری میکنند و وظیفه ذخیره داده ها را برعهده دارند .
در ادامه نحوه ساخت پارتیشن بندی دیتابیس در Postgresql را آموزش میدهیم .
ادامه مطلب ...
لینک کوتاه
سه شنبه , 23 دی 1393
5 دیدگاه
به لطف سایت وبشمار(webshomar.com) لازم شد بنچ مارکی روی رکوردهای نسبتا بالا(دومیلیون رکورد) روی دیتابیس محبوب mysql و postgresql انجام بدهم
مشخصات
mysql 5.5
postgresql 9.1
debian 7 os
ram 4gig
cpu Intel Core i5-2430M CPU @ 2.40GHz
این بنچ مارک روی سیستم شخصی خودم انجام شد و ساختار دیتابیس های هر دو مشابه بود و داده ها کاملا شبیه هم بودند
در تیبل از فیلد های int , char , varchar , smallint استفاده شده بود
مختصر نتایج این بنچ مارک به شرح زیر خدممتان ارائه میگردد
در دستورات select عادی با چندین condition دیتابیس mysql با اختلاف جزئی در حد یک دهم و یک صدم سریعتر از pg بود
اما نیاز سایت وبشمار ایجاب میکرد کوئریهای سنگین محاسباتی روی رکوردها انجام گیرد
دستوراتی شمارشی مثل select count(*) با چندیدن condition با برتری قابل ملاحضه ای با pgsql بود در تستی که انجام شد pgsql در 3.4 ثانیه و mysql در 6.4 ثانیه کوئری را به انجام رساند
در کوئری هایی که شامل دستور count و group by بود برتری با pgsql بود نتیجه کوئری در pgsql در 3.8 ثانیه و در mysql با 7.9 ثانیه به انجام رسید
در کوئری هایی که شامل دستور count(distinct field)بود برتری با mysql بود نتیجه یک کوئری در pgsql با 9.8 ثانیه و در mysql با 5.1 ثانیه به انجام رسید
اما در کوئری هایی که شامل distinct بدون استفاده از count بود برتری با pgsql بود با 2.6 ثانیه در حالیکه mysql در 4.6 ثانیه کوئری را به انجام رساند
در نهایت پیشنهاد میکنم بررسی کنید اگر قرار هست وبسایت شما داده های محاسباتی را ذخیره کند و لازم باشد محاسباتی روی داده ها انجام گیرد مثلا تعداد رکورد ها در سیستم هایی چون آمارگیر و انجمن و شبکه اجتماعی و امثالهم پیاده سازی کنید از postgresql استفاده کنید و اگر هم قرار هست سیستم های خبری و محتوایی پیاده سازی کنید از mysql استفاده کنید
اگر هم احساس میکنید رکوردهای شما هیچ وقت به میلیون رکورد نمیرسد از mysql استفاده کنید که سریعتر هست .
دقت کنید به طور مثال اگر سایت شما در هر دقیقه یک رکورد جدید به دیتابیس اضافه کند , بعد از دو سال به یک میلیون رکورد میرسد !!
پس حتما چشم انداز فعالیت سایتی که پیاده میکنید را بررسی کنید .
با تشکر رضا شیخله