在大型MySQL表中进行记录查找的最佳方法是什么?

时间:2014-03-31 16:01:41

标签: mysql database

我最近一直在想,但无法找到任何信息,哪种方法最适合在大型数据库中查找记录 - 尤其是MySQL数据库。

假设我有表格的数据库:

  • 主题:[ID主题,名称];
  • 书籍:[ID簿,ID用户,ID主题,标题];

用户有一些ID,我可以使用它来获取他的所有书籍。但是,我的用户只想在给定的主题中按标题了解他的书籍。

所以我需要根据2个索引进行搜索 - ID主题和ID用户。

表格主题可以有< 10条记录,而另一方面,表格书籍可以有> 10 000条记录。

我的想法是,获取用户要求的所有图书的最快方法是:

 SELECT books.title FROM books WHERE books.ID_topic = idTopic
 AND books.ID_user = idUser ORDER BY topics.ID_topic

您有什么看法,在这种情况下获取数据是最好也是最有效的方法吗?

修改

我在SELECT中犯了一个大错,谢谢你指出了这一点。

回答你的问题:

  • 用户可以拥有大约10本书,其中8本可以在id为1的类别中,在最后一个类别中为2。
  • 最好的意思是执行速度最快

2 个答案:

答案 0 :(得分:2)

你问的不是100%清楚,但这是我的猜测:

  1. 我建议书架上的索引:ALTER TABLE books ADD INDEX (ID_user, ID_topic)

  2. 像这样查询表:SELECT books.title FROM books WHERE books.ID_topic = idTopic AND books.ID_user = idUser。为此,您需要知道用户ID和主题ID。如果您想按主题名称查询,则需要加入

答案 1 :(得分:1)

如果您关心速度,那么您很有可能不需要速度。除非books非常大,否则即使是一个天真的算法也会以足够快的速度搜索它,任何体面的RDBMS都会比天真更好。如果一个有经验的专业人士没有处理谷歌/ NSA规模的数据大陆,他们会选择一个好的数据库引擎,正确地索引表格,并让RDBMS完成它的工作。

有人说过,让我们放弃主题:你的桌面设计看起来有点奇怪。如果两个用户拥有同一本书的副本怎么办?如果它是一个带有两个麦田守望者副本的图书馆或者一些神圣的废话怎么办?

您希望拥有一个book表,一个user表,然后是userbook表,并根据需要链接这两个表:

create table userbook (
    book_id int not null references book(book_id),
    user_id int not null references user(user_id)
)

select user.name
from 
    book b 
    inner join userbook ub
        on ub.book_id = b.book_id
    inner join user u
        on u.user_id = ub.user_id
    where
        book.title = 'It''s the Kali Yuga, Charlie Brown!'
        or book.topic = 'nihilism';

当然,您也需要一个作者表,依此类推,在一个完整的设计中供认真使用。但这是考虑这些事情的方式:如果关系可能有很多对很多,那么这种关系最好表示为链接表。