当前位置: 首页 > 知识库问答 >
问题:

mysql关系慢

归浩博
2023-03-14
<?php
$db = new mysqli(//editted out db credentials);

if($db->connect_errno > 0){
    die('Unable to connect to database [' . $db->connect_error . ']');
}
$sql = "SELECT m.ID, m.Title, GROUP_CONCAT(a.Title) AS Artist
FROM mp3s m
LEFT JOIN artist_relations ar ON ar.mp3ID = m.ID
LEFT JOIN artists a ON a.ID = ar.artistID
GROUP BY m.ID
ORDER BY ID
LIMIT 0,30;
";

if($result = $db->query($sql)){
echo "<table>";
while($row = $result->fetch_assoc()){
    echo "<tr>";  
    echo "<td>".$row['Title']."</td>";
    echo "<td>".$row['Artist']."</td>";
    echo "</tr>";  
}
echo "</table>";
}

?> 

这个查询工作正常,但速度很慢。

此数据库有3个字段:

`artists` : ID , Title
`mp3s` : ID , Title
`artist_relations` : mp3ID , artistID

我需要这个:

row1: titlemusic1 - artist1 , artist4 , artist5
row2: titlemusic2 - artist1
row3: titlemusic1 - artist3 , artist8
row4: titlemusic1 - artist9 , artist10
...

MP3、artist和artist_relations每个都有超过20000张唱片

EXPLAIN SELECT m.ID, m.Title, .... :
    id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
    1   SIMPLE  m   ALL     NULL    NULL    NULL    NULL    23718   Using temporary; Using filesort
    1   SIMPLE  ar  ALL     NULL    NULL    NULL    NULL    24337   
    1   SIMPLE  a   eq_ref  PRIMARY     PRIMARY     4   ganools_rj.ar.artistID  1   


--

如果不存在则创建表artist_relations(artistidint(11)NOT NULL,mp3idint(11)NOT NULL)engine=innoDB默认charset=latin1;

--

如果不存在则创建表artists(idint(11)不为NULL AUTO_INCREMENT,titlevarchar(155)不为NULL主键(id)))engine=innoDB DEFAULT charset=latin1 AUTO_INCREMENT=9005;

--

如果不存在mp3s(idint(11)NOT NULL AUTO_INCREMENT,titlevarchar(155)NOT NULL,imageURLvarchar(155)NOT NULL,mp3urlvarchar(155)NOT NULL,descriptiontext,lyrictext,albumvarchar(155)DEFAULT NULL,

共有1个答案

毛越
2023-03-14

尝试为artist_relations.mp3id、artist_relations.artistID和mp3s.id创建索引。请参见创建索引

 类似资料:
  • 问题内容: 我试图弄清楚如何构建该数据库。之前我已经使用过Apple的核心数据,现在我正在从事另一个需要MySQL的项目。我是MySQL的新手,所以请放轻松。:) 在这个例子中,假设我有三个表,,,和。把它画出来,一个可以有多个s,但是一个只能有一个;每个都有其主键,我需要使用它来获取正确的信息。 那么如何在这里建立这样的关系呢?我听说过创建索引和外键,但不确定它们如何正常工作。 最后,我需要做的

  • 问题内容: 我正在尝试在MySQL数据库中实现“一对一”的关系。例如,假设我有一个Users表和一个Accounts表。我想确保一个用户只能拥有一个帐户。每个用户只能有一个帐户。 我找到了两个解决方案,但是不知道该使用什么,还有其他选择。 第一个解决方案: 在此示例中,我在指向用户主键的帐户中定义外键。然后,我使外键成为唯一键,因此帐户中不能有两个相同的用户。要联接表,我将使用以下查询: 第二种解

  • 对于我正在构建的一个类似论坛的网站,我有PHP类'user'和'post‘。用户有一个帖子数组。如何与关系数据库中的连接相似?在“post”上有一个外键,指向一个“user”?这对我来说是有意义的,因为这是一对一的关系,而“user”到“post”是一对多的,就我所见。欢迎有任何想法-谢谢!

  • 我试图在MySQL数据库中实现“一对一”的关系。例如,假设我有一个Users表和一个Accounts表。我想确保一个用户只能有一个帐户。每个用户只能有一个帐户。 我找到了两个解决方案,但不知道该用什么,还有其他的选择。 在本例中,我定义了指向用户中主键的帐户中的外键。然后我使外键唯一,所以帐户中不能有两个相同的用户。要联接表,我将使用以下查询: null 如果我将这些解决方案中的任何一个导入到My

  • 问题内容: 在课堂上,我们都是“学习”数据库,每个人都在使用Access。厌倦了这一点,我试图做该类其余部分的工作,但是要使用MySQL的原始SQL命令而不是使用Access。 我已经设法创建数据库和表,但是现在如何在两个表之间建立关系? 如果我有两个这样的表: 和 如何在两个表之间创建“关系”?我希望为每个帐户“分配”一个customer_id(以指示谁拥有它)。 问题答案: 如果表是innod

  • 问题内容: 我有两个表:“电影”和“用户”。两者之间存在n:m关系,描述用户观看过哪些电影。这用表格“ seen”描述。现在,我想为给定的用户找出他尚未看过的所有电影。我当前的解决方案是这样的: 这可以正常工作,但扩展性似乎不太好。有更好的方法吗? 问题答案: 这是不使用您显示的子查询方法来执行此查询的典型方法。这可以满足@Godeke的要求,以查看基于联接的解决方案。 但是,在大多数品牌的数据库