php - Mysql - 查询和索引

标签 php mysql codeigniter

我想获得关于什么/如何使用索引和更好的 SQL 查询的想法和想法。

这是我的 SQL 查询示例:

SELECT albums.id AS album_id, albums.name AS album_name, albums.upc, albums.status, 
albumstatus.description AS album_status, DATE_FORMAT(albums.created, '%Y-%m-%d') AS created_date,  
albuminfos.label   
FROM albums,albumstatus, albumtypes, albuminfos  
WHERE albums.status = albumstatus.id AND albumtypes.id = albums.albumtype_id AND albums.id  = albuminfos.id  
AND albums.account_id = 9999  
AND albums.status IN (1, 2) 

我尝试使用 mysql EXPLAIN 输出:

id  select_type  table        type    possible_keys                           key         key_len  ref                                              rows  Extra        

 1  SIMPLE       albums       ref     PRIMARY,account_id,status,albumtype_id  account_id  4        const                                            4148  Using where  
 1  SIMPLE       albumstatus  eq_ref  PRIMARY,id                              PRIMARY     4        albums.status             1  Using where  
 1  SIMPLE       albumtypes   eq_ref  PRIMARY                                 PRIMARY     1        albums.albumtype_id       1  Using index  
 1  SIMPLE       albuminfos   eq_ref  PRIMARY                                 PRIMARY     4        albums.id                 1               

我经常使用 LEFT JOIN 并在主键上连接它们...我的 friend 告诉我使用索引来提高获得结果的速度。当我发现索引变慢时我感到很困惑写入查询的速度:INSERT、DELETE、UPDATE,其中 album 和 albuminfos 表可能随时有新的/更新的记录。所以我很迷茫,所以我想听听并从专业人士那里得到想法:

  1. 我的查询好吗?
  2. 在 mysql EXPLAIN 中我需要知道什么?
    • 是否可以使用索引?如果是..如何?
  3. 我的设置是对还是错?

谢谢!

最佳答案

问题 1:

将联接与 where 子句分开(这样更易于阅读且更合乎逻辑),否则您的查询似乎以旧方式正确。

SELECT albums.id AS album_id, albums.name AS album_name, albums.upc, albums.status, 
    albumstatus.description AS album_status, DATE_FORMAT(albums.created, '%Y-%m-%d') AS created_date,  
    albuminfos.label   
FROM albums
LEFT OUTER JOIN albumstatus sta ON  albums.status = albumstatus.id
LEFT OUTER JOIN albumtypes  typ ON  albumtypes.id = albums.albumtype_id
LEFT OUTER JOIN albuminfos  inf ON  albums.id     = albuminfos.id  
WHERE  albums.account_id = 9999  AND albums.status IN (1, 2) ;

你的索引是正确的。

对于复合索引(@ypercube):

    ALTER TABLE albums ADD INDEX idx_account_id (account_id ASC, status ASC) ;

问题 2:

Force MySQL to use two indexes on a Join

但 MySQL 通常做得很好。

问题 3:

您的表相册中有多少条记录?

关于php - Mysql - 查询和索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17399530/

相关文章:

javascript - 电子邮件返回数字值而不是名称

php - 如果某些值是空的,则将 $_POST 值插入 MySQL 表中

mysql - 如何在 mySQL 中定义自定义 ORDER BY 顺序

php - 如何将自相似子对象(深层对象保存)保存到数据库中?

javascript - 来自 codeigniter Controller 的值,用于查看 javascript 变量并将其显示为数组

php - 无法从 PHP 页面更新 sqlite3 数据库

php - CSV 从 UTF8 到 ISO-8859-1

mysql - 两个 Laravel 应用可以使用同一个数据库吗?

PHP 使用数组值截断和删除问题

mysql - 计数函数 - Codeigniter 和 MySQL