Mysql有两种选择方式。哪种方式使用更少的资源,速度更快?

时间:2015-01-12 05:33:01

标签: mysql

例如,有像domain.com/transport/cars

这样的网址

基于url想要从mysql中选择并显示汽车广告列表

想要选择最快的方法(花费较少时间显示结果并使用较少资源的方法)。

比较两种方式

第一种方式

包含

行的Mysql表transport
FirstLevSubcat | Text
---------------------------------
  1            | Text1 car
  2            | Text1xx lorry
  1            | Text another car

FirstLevSubcat类型为int

然后是另一个mysql表subcategories

Id | NameOfSubcat
---------------------------------
1  | cars
2  | lorries
3  | dogs
4  | flats

一样查询
 SELECT Text, AndSoOn FROM transport 
 WHERE 
 FirstLevSubcat = (SELECT Id FROM subcategories WHERE NameOfSubcat = `cars`)

或者代替SELECT Id FROM subcategories从xml文件或php数组获取Id

第二种方式

包含

行的Mysql表transport
FirstLevSubcat | Text
---------------------------------
  cars         | Text1 car
  lorries      | Text1xx lorry
  cars         | Text another car

FirstLevSubcat类型为varcharchar

简单地查询

 SELECT Text, AndSoOn FROM transport 
 WHERE FirstLevSubcat = `cars`

请建议哪种方式使用更少的资源,花更少的时间来显示结果。我读到更好的选择int而不是varchar SQL SELECT speed int vs varchar 那么了解第一种方式会更好吗?

2 个答案:

答案 0 :(得分:1)

烨。正如您的问题中的SO链接所暗示的那样,int比较比字符比较更快并且产生更快的提取。牢记这一点,首先将设计视为更好的设计。但是从不推荐子查询。改为使用连接。

例如:

 SELECT t.Text, t.AndSoOn FROM transport t
 INNER JOIN subcategories s ON s.ID = t.FirstLevSubcat
 WHERE s.NameOfSubcat = 'cars'

答案 1 :(得分:1)

第一种设计要好得多,因为你在数据中分离了两个事实:

  1. 有一个类别' cars'
  2. ' Text1 car'属于类别'汽车'。
  3. 想象一下,在你的第二个设计中,你进入另一辆车,但输入“cors”'而不是' cars'。 dbms没有看到这一点,因此您创建了另一个具有单个条目的类别。 (好吧,在MySQL中,您可以使用枚举列来绕过这个问题,但是大多数其他dbms都没有。无论如何,无论何时你想重命名你的类别,比如来自' cars' to& #39; vans',那么你必须改变所有现有记录并改变表格,而不是简单地在子类别表中重命名一次。)

    所以远离你的第二个设计。

    至于Praveen Prasannan对子查询和连接的评论:这是无稽之谈。您的查询很直接,也很好。您希望从类别所需的运输中进行选择。完善。有两组人喜欢在这里加入:

    1. 初学者根本不知道更好,总是从一开始就加入,并最终尝试解决问题。
    2. 有经验的程序员知道某些dbms经常比子查询更好地处理联接。但这是一种悲观的习惯。更好地编写您的查询,使其易于阅读和维护,就像您现在所做的那样,并且只有在出现严重的性能问题时才更改它。