例如,有像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
类型为varchar
或char
简单地查询
SELECT Text, AndSoOn FROM transport
WHERE FirstLevSubcat = `cars`
请建议哪种方式使用更少的资源,花更少的时间来显示结果。我读到更好的选择int而不是varchar SQL SELECT speed int vs varchar 那么了解第一种方式会更好吗?
答案 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)
第一种设计要好得多,因为你在数据中分离了两个事实:
想象一下,在你的第二个设计中,你进入另一辆车,但输入“cors”'而不是' cars'。 dbms没有看到这一点,因此您创建了另一个具有单个条目的类别。 (好吧,在MySQL中,您可以使用枚举列来绕过这个问题,但是大多数其他dbms都没有。无论如何,无论何时你想重命名你的类别,比如来自' cars' to& #39; vans',那么你必须改变所有现有记录并改变表格,而不是简单地在子类别表中重命名一次。)
所以远离你的第二个设计。
至于Praveen Prasannan对子查询和连接的评论:这是无稽之谈。您的查询很直接,也很好。您希望从类别所需的运输中进行选择。完善。有两组人喜欢在这里加入: