MySql临时表VS视图VS php数组
我目前创建了一个类似facebook的页面,可以从不同的表中提取通知,比如说8个表。每个表都有不同的结构和不同的列,所以首先想到的是,我将有一个全局表,就像一个目录,并在每次点击时刷新它。我知道插入是资源密集型的,但我希望因为它是一个静态表,所以每100个访问者我只会添加一条新记录,所以我想也许我可以侥幸逃脱,但我错了。我设法从仅仅三个人对网站的攻击中获得了僵局 所以不管怎样,现在我必须用另一种方法重做它。最初我打算做视图,但我对视图有一个问题。所选表必须包含用户id。下面是php中select语句的示例:MySql临时表VS视图VS php数组,php,mysql,Php,Mysql,我目前创建了一个类似facebook的页面,可以从不同的表中提取通知,比如说8个表。每个表都有不同的结构和不同的列,所以首先想到的是,我将有一个全局表,就像一个目录,并在每次点击时刷新它。我知道插入是资源密集型的,但我希望因为它是一个静态表,所以每100个访问者我只会添加一条新记录,所以我想也许我可以侥幸逃脱,但我错了。我设法从仅仅三个人对网站的攻击中获得了僵局 所以不管怎样,现在我必须用另一种方法重做它。最初我打算做视图,但我对视图有一个问题。所选表必须包含用户id。下面是php中select
$get_events = "
SELECT id, " . $userId . ", 'admin_events', 0, event_start_time
FROM admin_events
WHERE CURDATE() < event_start_time AND
NOT EXISTS(SELECT id
FROM admin_event_registrations
WHERE user_id = " . $userId . " AND admin_events.id = event_id) AND
NOT EXISTS(SELECT id
FROM admin_event_declines
WHERE user_id = " . $userId . " AND admin_events.id = event_id) AND
event_capacity > (SELECT COUNT(*) FROM admin_event_registrations WHERE event_id = admin_events.id)
LIMIT 1
抱歉弄得一团糟。在任何情况下,如您所见,我都需要从页面返回用户Id,作为表中的选定列。我不知道如何处理视图,所以我不认为视图是我将要使用的方式,因为这些类型的查询要多得多。我来自MSSQL的背景,我喜欢存储过程,所以如果有MYSQL的存储过程,那就太好了
接下来,我开始考虑临时表。该表将在内存中,该表最多可能有150行,并且不会出现死锁。在临时表上进行插入仍然非常昂贵吗?我会导致服务器崩溃吗?现在我们每天大概有100个用户,但当我们有更多的用户时,我想尝试成为未来的证明
经过长时间的思考,我认为唯一的方法是使用php并将所有结果作为一个数组来获取。问题是,我会得到如下结果:
$my_array[0]["date_created"] = <current_date>
上面的问题是我必须按创建的日期进行排序,但这是一个多维数组
无论如何,要从数据库中最多提取150到200条记录,您会采取哪种方法?临时表、视图或php?问题在于您使用的是相关子查询。我想如果查询不在查询缓存中,运行查询需要一点时间?这就是导致表锁定和争用的原因 将表类型切换到InnoDB会有所帮助,但您的核心问题是查询 150到200张唱片是一个非常大的数目。MySQL确实支持存储过程,但这不是您需要的。插入不是资源密集型的,但是一次插入很多内容,或者按顺序使用大容量插入语法可能会导致问题 一些想法: 临时表格: 临时表仅在会话处于活动状态时持续。如果在PHP脚本中运行代码,则在脚本完成执行后,临时表将自动销毁 观点: 这些主要用于隐藏复杂性,因为您使用连接创建它,然后像访问单个表一样访问它。下划线代码是SELECT语句 PHP数组: 从中获取数据比SQL要麻烦一些。然而,PHP确实有一些使生活更简单的函数,但没有真正的查询语言 存储过程: MySQL中有存储过程-请参阅: 我的建议是: 首先,使用MySQL查询分析器重新编写查询: 现在我将使用PHP将我的值放入数组中。这仍然会将最初的繁重工作留给数据库引擎,并阻止您多次调用数据库服务器。尝试以下方法:
SELECT id, " . $userId . ", 'admin_events', 0, event_start_time
FROM admin_events AS ae
LEFT JOIN admin_event_registrations AS aer
ON ae.id = aer.event_id
LEFT JOIN admin_event_declines AS aed
ON ae.id = aed.event_id
WHERE aed.user_id = ". $userid ."
AND aer.user_id = ". $userid ."
AND aed.id IS NULL
AND aer.id IS NULL
AND CURDATE() < ae.event_start_time
AND ae.event_capacity > (
SELECT SUM(IF(aer2.event_id IS NOT NULL, 1, 0))
FROM admin_event_registrations aer2
JOIN admin_events AS ae2
ON aer2.event_id = ae2.id
WHERE aer2.user_id = ". $userid .")
LIMIT 1
它仍然有一个子查询,但您会发现它比给出的其他选项快得多。MySQL可以很容易地连接表,但是它们都应该是相同的表类型。另外,除非处理空值,否则最后一个count语句不会以您希望的方式对空结果作出响应。这一切都可以在一瞬间完成,使用join语句可以显著减少您的总体查询时间。我知道我的表是InnoDB。在某个时候可能会有一个大容量插入,这取决于我必须更新的通知数量,所以这可能就是发生的情况。这很理想,但不幸的是,所有表都有不同的字段,并且彼此之间没有链接。请记住,这是一个通知系统,因此它显示的内容包括新用户、管理员通知、事件、引用等。视图不是必需的select语句。它们也可能是临时桌子。看到了吗