use*_*467 5 mysql database database-design
我正在尝试为我正在开发的程序设计数据库。我希望在发布程序之前设计是完美的,因为我听说一旦运行就很难改变。总而言之,我的程序是一个买卖书籍的平台。用户可以在一个“距离”内搜索,看看在他们指定的搜索距离内是否有该特定 isbn 的任何书籍。他们可以按价格或日期列出书籍。我将根据下表描述我的程序需要采取的操作:
BookListings (table)...
userID VARCHAR(50) NOT NULL
dateListed timestamp Default: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
isbn13 VARCHAR(20) NOT NULL
price UNSIGNED TINYINT NOT NULL
email VARCHAR(30) NOT NULL
phone VARCHAR(20) NOT NULL
condition VARCHAR(30) NOT NULL
latitude FLOAT(9,7) NOT NULL
longitude FLOAT(9,7) NOT NULL
ContactInfo (table)...
email VARCHAR(30) NOT NULL
phone VARCHAR(20) NOT NULL
Run Code Online (Sandbox Code Playgroud)
请记住,ContactInfo 表并不是非常重要。一旦我将信息从数据库中移出以释放空间,我就会经常清除它。如果这张桌子造成了严重的效率问题,我可以完全牺牲它,而且我不会真正感到烦恼。
禁止用户(表)...
BannedUsers 表是我要跟踪禁令的地方。它很少被使用,但如果出于某种原因我想禁止某人使用我的程序,我可以将他们的用户 ID 放在那里。当我的程序启动时,它会检查 BannedUsers 表以查看用户是否被禁止,如果是,则会给出禁止原因。
我有点困惑在哪里放置索引(我对它们不太了解)。我刚刚听说索引可以极大地加快搜索速度。对于我的 BannedUsers,我认为将索引放在 userID 列上是显而易见的吗?如果是的话,什么样的索引?
对于 BookListings 表,我更困惑在哪里放置索引。首先,我将解释我的程序的所有功能(要采取的操作)以及从我的 php 脚本中获取的查询:
INSERT INTO Listings
VALUES ('$userID', (NOW() + INTERVAL 2 HOUR), '$isbn13', $price, '$email', '$phone',
'$condition', '$latitude', '$longitude')
Run Code Online (Sandbox Code Playgroud)
SELECT
*, (
6371 * acos (
cos ( radians($userLatitude) )
* cos( radians( latitude ) )
* cos( radians( longitude ) - radians($userLongitude) )
+ sin ( radians($userLatitude) )
* sin( radians( latitude ) )
)
) AS distance
FROM Listings
WHERE isbn13='$isbn13'
HAVING distance <= $withinDistance
ORDER BY price, dateListed
Run Code Online (Sandbox Code Playgroud)
上面的查询是按价格排序。以下查询改为按日期排序:
SELECT
*, (
6371 * acos (
cos ( radians($userLatitude) )
* cos( radians( latitude ) )
* cos( radians( longitude ) - radians($userLongitude) )
+ sin ( radians($userLatitude) )
* sin( radians( latitude ) )
)
) AS distance
FROM Listings
WHERE isbn13='$isbn13'
HAVING distance <= $withinDistance
ORDER BY dateListed DESC
Run Code Online (Sandbox Code Playgroud)
INSERT INTO ContactInfo
VALUES ('$email', '$phone')
Run Code Online (Sandbox Code Playgroud)
SELECT COUNT(*) FROM ContactInfo
Run Code Online (Sandbox Code Playgroud)
SELECT dateListed, isbn13, price
FROM Listings
WHERE userID='$userID'
ORDER BY dateListed DESC
Run Code Online (Sandbox Code Playgroud)
DELETE FROM Listings WHERE userID='$userID' AND isbn13='$isbn13
Run Code Online (Sandbox Code Playgroud)
请帮助我提高设计效率。我不太确定在哪里建立索引,因为我知道索引意味着它会使更新和删除变得更加困难......我的程序也需要这样做。最初我想到索引 isbn13 (将要搜索的主要内容),但后来意识到我还将搜索纬度和经度,所以我不确定是否也必须对它们建立索引......这真的很令人困惑我。请告诉我可以做些什么来改进数据库的设计和查询。
天下没有免费的午餐。指数有好处也有成本。
好处是一些操作会更快。
代价是某些操作会变慢,并且你会消耗更多的磁盘空间和内存。
查找记录(包括查找更新和删除记录)会更快,但更新记录、删除记录和插入记录会更慢,因为需要更新索引。
您的查询目前速度慢吗?为什么?您需要查看您的执行计划以了解它们为何缓慢。如果由于顺序扫描而导致速度缓慢,请尝试添加索引。这对插入、删除和更新有何影响?值得付出这样的代价吗?您是否有足够的磁盘空间和内存来存储这些索引?这些是我们无法为您解答的问题。
| 归档时间: |
|
| 查看次数: |
1403 次 |
| 最近记录: |