Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql临时表VS视图VS php数组_Php_Mysql - Fatal编程技术网

MySql临时表VS视图VS php数组

MySql临时表VS视图VS php数组,php,mysql,Php,Mysql,我目前创建了一个类似facebook的页面,可以从不同的表中提取通知,比如说8个表。每个表都有不同的结构和不同的列,所以首先想到的是,我将有一个全局表,就像一个目录,并在每次点击时刷新它。我知道插入是资源密集型的,但我希望因为它是一个静态表,所以每100个访问者我只会添加一条新记录,所以我想也许我可以侥幸逃脱,但我错了。我设法从仅仅三个人对网站的攻击中获得了僵局 所以不管怎样,现在我必须用另一种方法重做它。最初我打算做视图,但我对视图有一个问题。所选表必须包含用户id。下面是php中select

我目前创建了一个类似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语句。它们也可能是临时桌子。看到了吗