PDA

View Full Version : کدام جدول بهتره؟؟؟



milad_d993
یک شنبه 24 آبان 1394, 13:33 عصر
سلام
31 جدول برای استان ها داشته باشیم؛ هر جدول 200 هزار رکورد (مشخصات افراد توی سطر ها هست) بدون هیچگونه ایندکس گذاری

1 جدول با 6 میلیون و 200 هزار رکورد؛ و ایندکس کردن فیلد استان (نوعش int و از 1 تا 31 مقدار میگیره)

جستجو توی کدامشان سریعتر صورت میگیره؟؟؟

us1234
یک شنبه 24 آبان 1394, 16:20 عصر
در حالت اول ، اگر خواستید فرد x را بدانید داخل کدام استان است چکار میکنید ؟ تمام 31 جدول را سرچ می کنید ؟

milad_d993
یک شنبه 24 آبان 1394, 16:40 عصر
در حالت اول ، اگر خواستید فرد x را بدانید داخل کدام استان است چکار میکنید ؟ تمام 31 جدول را سرچ می کنید ؟
لازم ندارم؛ اگه هم بخوام یا همین که شما گفتین؛ 31 جدول رو سرچ میکنم
توی صفحه اول استان رو انتخاب میکنم و توی صفحه بعد یه کادر هست که نام و نام خانوادگی رو میگیره و بقیه مشخصات رو میده....

قبلا یه طور دیگه سوالم رو پرسیده بودم توی اینجا (http://barnamenevis.org/showthread.php?512260-%D8%B3%D9%88%D8%A7%D9%84-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-index-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C) جواب نگرفتم دوباره اینجا پرسیدم؛


سلام دوستان
جدولی به اسم user دارم که دارای فیلد های نام، نام خانوادگی، شهر (مراکز استان) و 10 فیلد دیگه هست
این جدول دارای 5 میلیون سطر هست
توی یکی از کوئری ها لازم دارم که مثلا کسانی که اسمشان میلاد و ساکن شهر تهران هستند رو واکشی کنم

من فیلد شهر رو index کردم و کوئری زیر حدودا 500 هزار رکورد داره توش


select * from user where city = 21

حالا میخوام روی این نتیجه یه کوئری دیگه بزنم و کسانی که اسمشان میلاد هست رو دریافت کنم


select * from (select * from user where city = 21) where name = 'میلاد'


این رو تست کردم و خطا گرفتم؛ کوئری بالا (در صورت صحیح بودن؛ هست؟؟؟) با کوئری زیر چه فرقی داره از نظر سرعت:


select * from user where city=21 and name = 'میلاد'


میخوام بدونم وقتی بر اساس چند فیلد میخوایم جستجو داشته باشیم آیا خوبه که فیلد کلیدی رو index کنیم و بقیه پارامتر ها index نباشن؟؟؟
(توی این مثال index کردن 5 میلون رکورد که city بین 1 تا 31 دارن راحت تر نیست تا index کردن نام که n حالت مختلف داره.... ؟؟؟؟؟؟؟؟؟؟؟)

با تشکر

Unique
یک شنبه 24 آبان 1394, 17:52 عصر
نیاز به ۳۱ جدول نیست ، شما باید بدونی دقیقا میخوای چه query بنویسی و جدول را برای اون بهینه کنی ! شرمنده اما کجا چنین برداشتی داشتی که ۳۰ تا جدول استفاده کنی !؟ mysql با بیلیون رکورد هم مشکلی نداره. این ارفامی که میگی هیچی نیست.

توی مثال شما همین که هر استان توی یک فیلد از نوع عددی TINYINT باشه (اگه شهر باشه هم میتونی از smallint استفاده کنی) و index هم بشه برای بخش جدا کردن استان ها (یا شهر ها) کفایت میکنه. اما پیدا کردن کاربر از روی نام و نام خانوادگی به نظر من زیاد جالب نیست ! مثلا بهتره با کد ملی جستجو کنیم که در این صورت با گذاشتن یک index روی فیلد کد ملی مشکل اونم حل میشه. اما اگه میخوای از نام و نام خانوادگی استفاده کنی باز هم مشکلی نیست و با یک Index ساده مشکلت حل میشه. فقط دقت کن طول varchar را الکی بالا ندی ! مثلا ۳۰ یا ۵۰ کاراکتر کفایت میکنه.

اینجا (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) توضیح داده mysql کجا و چطوری از Index ها استفاده میکنه. اما از مهمترین هاش میشه به فیلد هایی که بعد از where میان ،‌ زمانی که join میکنیم ، زمانی که order by یا group by میکنیم اشاره کرد.

در مورد کار شما نیاز به FULLTEXT Search نیست اما میتونه توی خیلی جا ها مناسب باشه. کلا وقتی میبینی کسی جداول را میشکونه یا منطق های عجیب و غریب مینویسه مشکلش اینه یا نمیدوونه چطور index گذرای کنه یا join بلد نیست یا از قابلیت های mysql چیزی نمیدونه.

milad_d993
یک شنبه 24 آبان 1394, 18:02 عصر
نیاز به ۳۱ جدول نیست ، شما باید بدونی دقیقا میخوای چه query بنویسی و جدول را برای اون بهینه کنی ! شرمنده اما کجا چنین برداشتی داشتی که ۳۰ تا جدول استفاده کنی !؟ mysql با بیلیون رکورد هم مشکلی نداره. این ارفامی که میگی هیچی نیست.

توی مثال شما همین که هر استان توی یک فیلد از نوع عددی TINYINT باشه (اگه شهر باشه هم میتونی از smallint استفاده کنی) و index هم بشه برای بخش جدا کردن استان ها (یا شهر ها) کفایت میکنه. اما پیدا کردن کاربر از روی نام و نام خانوادگی به نظر من زیاد جالب نیست ! مثلا بهتره با کد ملی جستجو کنیم که در این صورت با گذاشتن یک index روی فیلد کد ملی مشکل اونم حل میشه. اما اگه میخوای از نام و نام خانوادگی استفاده کنی باز هم مشکلی نیست و با یک Index ساده مشکلت حل میشه. فقط دقت کن طول varchar را الکی بالا ندی ! مثلا ۳۰ یا ۵۰ کاراکتر کفایت میکنه.

اینجا (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) توضیح داده mysql کجا و چطوری از Index ها استفاده میکنه. اما از مهمترین هاش میشه به فیلد هایی که بعد از where میان ،‌ زمانی که join میکنیم ، زمانی که order by یا group by میکنیم اشاره کرد.

در مورد کار شما نیاز به FULLTEXT Search نیست اما میتونه توی خیلی جا ها مناسب باشه. کلا وقتی میبینی کسی جداول را میشکونه یا منطق های عجیب و غریب مینویسه مشکلش اینه یا نمیدوونه چطور index گذرای کنه یا join بلد نیست یا از قابلیت های mysql چیزی نمیدونه.
آخه از شوربختی فیلدی برای شماره ملی نداریم :( و فقط هم نام و نام خانوادگی نیست؛ و 4،5 مورد دیگه هم هست که جستجو بر حسب اون ها هم انجام میشه

اینکه میگم 31 جدول برای اینکه تعداد رکورد هایی که باید جستجو بشن کمتر بشه تا دیگه مجبور نباشم کل فیلد ها رو index کنم

اگه از 15 تا فیلد 11 تاشو index کنیم چی میشه؟؟؟؟

برای تست سرعت کوئری ها از چی باید استفاده کنم که بدانم تو چند ثانیه انجام میشه (مثلا تو 5 میلیون رکورد...)

Unique
یک شنبه 24 آبان 1394, 23:56 عصر
فقط هم نام و نام خانوادگی نیست؛ و 4،5 مورد دیگه هم هست که جستجو بر حسب اون ها هم انجام میشه
توی اکثر فرم های جستجو بیش از یک فیلد برای جستجو داده میشه اما عمم روی یکی دو تا واقعا کاربر جستجو را انجام میده.


اینکه میگم 31 جدول برای اینکه تعداد رکورد هایی که باید جستجو بشن کمتر بشه تا دیگه مجبور نباشم کل فیلد ها رو index کنم
لازم نیست همه فیلد ها index بشه ، ببین باید بررسی کرد و دید عموما جستجو روی چه فیلد هایی انجام میشه و اون ها را index کرد. index گذاری خیلی چیز بدی هم نیست اما حواستون به cardinality باشه و فیلد هایی که نیاز ندارن را نمیخواد index کنی.


اگه از 15 تا فیلد 11 تاشو index کنیم چی میشه؟؟؟؟
راستش من تا حالا به چنین کاری نیزا نداشتم ! نهایت ۴ یا ۵ تا فیلد. اما نباید اتفاق عجیبی بیفته.


رای تست سرعت کوئری ها از چی باید استفاده کنم که بدانم تو چند ثانیه انجام میشه
از explain استفاده کن تا هم وضعیت query و استفادش از ایندکس ها را ببینی و هم زمان و غیره ... را ، اینطوری :


برای تست سرعت کوئری ها از چی باید استفاده کنم که بدانم تو چند ثانیه انجام میشه
بستگی داره که از چه نرم افزاری استفاده میکنی مثلا phpmyadmin یک بخش Profiling داره که این اصلاعات را میده ، نرم افزار MySQL Workbench هم در زمان اجرای query ها زمان اجرا را میده. با Explain هم میتونی اطلاعات بیشتری در مورد چگونگی انجام شدن query و استفاده از index ها بگیری. کافیه قبل از select یک کلمه explain هم بگذاری !

یه توصیه اینکه کلا از بحث جداول بیشتر بیا بیرون ! اول کل پروژه را هر جور که به صورت عادی انجام میدی انجام بده و بعدش میتونی بیای query ها و جداول و فیلد ها را بهینه کنی.

plague
دوشنبه 25 آبان 1394, 15:26 عصر
اگه از 15 تا فیلد 11 تاشو index کنیم چی میشه؟؟؟؟



کلا قاعده اینه که با بالا رفتن ایندکس ها سرعت نوشتن تو دیتابیس میاد پایین
البته این آمار ها نسبی هستن .... یعنی اینکه نسبت به سرعت قبل که مثلا x میلی ثانیه بوده کمتر یا بیشتر میشه مثلا x+2 میلی ثانیه .. که هزینه کم و قابل قبولیه
در کل با 1 تیبل فکر میکنم به راحتی ساپورت کنه