Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Optimalisasi kinerja MySQL:pesan berdasarkan bidang datetime

Buat indeks komposit baik pada postings (is_active, post_date) (dalam urutan itu).

Ini akan digunakan untuk memfilter is_active dan memesan sebelum post_date .

MySQL harus menampilkan REF metode akses melalui indeks ini dalam EXPLAIN EXTENDED .

Perhatikan bahwa Anda memiliki RANGE memfilter kondisi di atas user_offtopic_count , itu sebabnya Anda tidak dapat menggunakan indeks di atas bidang ini baik dalam pemfilteran maupun pengurutan berdasarkan bidang lain.

Bergantung pada seberapa selektif user_offtopic_count Anda (yaitu berapa banyak baris yang memenuhi user_offtopic_count < 10 ), mungkin lebih berguna untuk membuat indeks di user_offtopic_count dan biarkan tanggal_posting diurutkan.

Untuk melakukannya, buat indeks gabungan pada postings (is_active, user_offtopic_count) dan pastikan RANGE metode akses melalui indeks ini digunakan.

Indeks mana yang akan lebih cepat tergantung pada distribusi data Anda. Buat kedua indeks, FORCE mereka dan lihat mana yang lebih cepat:

CREATE INDEX ix_active_offtopic ON postings (is_active, user_offtopic_count);
CREATE INDEX ix_active_date ON postings (is_active, post_date);

SELECT 
    `postings`.`id`, 
    UNIX_TIMESTAMP(postings.post_date) as post_date, 
    `postings`.`link`, 
    `postings`.`title`, 
    `postings`.`author`, 
    `postings`.`excerpt`, 
    `postings`.`long_excerpt`, 
    `feeds`.`title` AS feed_title, 
    `feeds`.`website` AS feed_website
FROM 
    `postings` FORCE INDEX (ix_active_offtopic)
JOIN 
    `feeds` 
ON 
    `feeds`.`id` = `postings`.`feed_id`
WHERE 
    `feeds`.`type` = 1 AND 
    `postings`.`user_offtopic_count` < 10 AND 
    `postings`.`is_active` = 1
ORDER BY 
    `postings`.`post_date` desc
LIMIT 
    15

/* This should show RANGE access with few rows and keep the FILESORT */

SELECT 
    `postings`.`id`, 
    UNIX_TIMESTAMP(postings.post_date) as post_date, 
    `postings`.`link`, 
    `postings`.`title`, 
    `postings`.`author`, 
    `postings`.`excerpt`, 
    `postings`.`long_excerpt`, 
    `feeds`.`title` AS feed_title, 
    `feeds`.`website` AS feed_website
FROM 
    `postings` FORCE INDEX (ix_active_date)
JOIN 
    `feeds` 
ON 
    `feeds`.`id` = `postings`.`feed_id`
WHERE 
    `feeds`.`type` = 1 AND 
    `postings`.`user_offtopic_count` < 10 AND 
    `postings`.`is_active` = 1
ORDER BY 
    `postings`.`post_date` desc
LIMIT 
    15

/* This should show REF access with lots of rows and no FILESORT */


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Parameter MyBatis dari HashMap

  2. Periksa apakah ada nama pengguna PDO

  3. Perbarui kunci utama Django MySQL

  4. Cara Mengimpor dan Mengekspor File CSV Menggunakan PHP dan MySQL

  5. TIMESTAMPADD() Contoh – MySQL