• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
زمان اجرای بسیار بالای جستجو
#1
با سلام این جستجو 39 ثانیه طول میکشه واسه من.

SELECT * FROM `sms` WHERE sms_id in (select sms_id from report where user_id=1 and rep_id>=5500)

جدول sms حدود 7300 تا رکورد داره و جدول report حدود 8200 تا رکورد داره.

میتونین کمک کنین سرعتشو زیاد کنم؟

کد:
CREATE TABLE IF NOT EXISTS `sms` (
  `sms_id` int(11) NOT NULL AUTO_INCREMENT,
  `text` text NOT NULL,
  `c_id` int(11) NOT NULL,
  `u_id` int(11) NOT NULL,
  `date` text,
  `sms_confirm` int(11) DEFAULT '0',
  PRIMARY KEY (`sms_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12042 ;


کد:
CREATE TABLE IF NOT EXISTS `report` (
  `rep_id` int(11) NOT NULL AUTO_INCREMENT,
  `sms_id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `date` text,
  `confirm` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`rep_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8307 ;
  پاسخ
تشکر شده توسط :
#2
تو سیستم من 7 ده هزارم ثانیه طول کشید!
ببین برای چی هی داری اینو چک میکنی که اگه نبود بسازه؟
مگه نمیگی 7300 تا رکورد داره، پس هست دیگه؟!!!
هر که با مرغ هوا دوست شود - خوابش آرامترین خواب جهان خواهد بود.
  پاسخ
تشکر شده توسط :
#3
همه چی به بهینه سازی پایگاه داده بر میگرده. شما باید روی ستون هایی که زیاد SELECT میشن INDEX بذاری و کوئری رو برای انتخاب اون ستون ها بطور مخصوص خودشون بنویسی.
همینطور خودت تصمیم بگیری که چه درصدی از عملیاتی که روی پایگاه داده و جداولت صورت میگیره SELECT هست نه INSERT . اگر درصد بیشتری SELECT بود اون جدولت رو از نوع Innodb قرار بدی درغیر اینصورت MyISAM بهتره. (تجربه شخصی) البته توجه داشته باش که full-text search ها روی innodb جواب نمیده.

http://dev.mysql.com/doc/refman//5.5/en/...tion_match

نقل قول:Indexes are used to find rows with specific column values quickly. Without an index, MySQL must begin with the first row and then read through the entire table to find the relevant rows. The larger the table, the more this costs. If the table has an index for the columns in question, MySQL can quickly determine the position to seek to in the middle of the data file without having to look at all the data. If a table has 1,000 rows, this is at least 100 times faster than reading sequentially. If you need to access most of the rows, it is faster to read sequentially, because this minimizes disk seeks.

http://dev.mysql.com/doc/refman/5.0/en/m...dexes.html
غایب
  پاسخ
تشکر شده توسط : shell32
#4
این روش کوئری زدن هم کاملا اشتباه هست. یه مقدار رکوردها بالاتر بره فاتحه سیستم خوندست
درستش میشه این
کد:
SELECT sms.*  from sms join report on report.sms_id=sms.sms_id and report.user_id=1 and report.rep_id>=5500
روی sms_id (هر دو) و user_id و rep_id حتما باید ایندکس باشه
  پاسخ
تشکر شده توسط : shell32 zoghal
#5
+
همچنین * select حجم بیشتری از memory رو اشغال می کنه و سرعت کمتری هم داره
اینطوری بنویس: select field1, field2, field3...


نقل قول:ببین برای چی هی داری اینو چک میکنی که اگه نبود بسازه؟
مگه نمیگی 7300 تا رکورد داره، پس هست دیگه؟!!!
هی چک نمی کنه. ساختار sql ش اینه
فقط 1 بار برای نصب اولیه چک میشه.
کار خوبیه برای جلوگیری از رویداد خطا و handle کردنش
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط : shell32 hamid_80386 zoghal
#6
(۱۳۹۱ خرداد ۲۴, ۱۱:۲۱ ب.ظ)admin نوشته: این روش کوئری زدن هم کاملا اشتباه هست. یه مقدار رکوردها بالاتر بره فاتحه سیستم خوندست
درستش میشه این
کد:
SELECT sms.*  from sms join report on report.sms_id=sms.sms_id and report.user_id=1 and report.rep_id>=5500
روی sms_id (هر دو) و user_id و rep_id حتما باید ایندکس باشه

ممنون جواب داد توی 0.0094 اجرا شد.Big Grin
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان