如何加快我的mysql JOIN查询?

时间:2016-01-29 05:29:43

标签: php mysql

我正在开发一个社交聊天应用程序。在我的应用程序有5000个用户。我想在网上获取最近1小时的用户名。

我有两张表usersmessages。我的数据库很重。 users表有4983条记录,messages表有大约15百万条记录。我想向20位用户显示最近1小时内用户发送消息的信息。

我的查询 -

SELECT a.username,a.id FROM users a JOIN messages b
  WHERE a.id != ".$getUser['id']." AND
  a.is_active=1 AND
  a.is_online=1 AND
  a.id=b.user_id AND
  b.created > DATE_SUB(NOW(), INTERVAL 1 HOUR)
      GROUP BY b.user_id
      ORDER BY b.id DESC LIMIT 20

用户表 -

enter image description here

消息表 -

enter image description here

以上查询工作正常。但是我的查询太慢了。有时候页面被绞死了。我想获得更快的记录。

注意 - $getUser['id']是登录用户ID。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用indexes

  

数据库索引是一种提高速度的数据结构   表中的操作。可以使用一个或多个创建索引   列,为快速随机查找提供基础   有效排序访问记录。

     

在创建索引时,应该考虑什么是   将用于进行SQL查询并创建一个或多个的列   这些列的索引。

     

实际上,索引也是表的类型,它保留主键   或索引字段和指向实际表中每条记录的指针。

     

用户无法看到索引,它们只是用来加速   查询并将由数据库搜索引擎用于查找记录   很快。

     

INSERT和UPDATE语句在具有索引的表上花费更多时间   SELECT语句在这些表上变快的地方。原因是   在进行插入或更新时,数据库需要插入或更新   指数值。

简单而独特的索引:

您可以在表格上创建唯一索引。唯一索引意味着两行不能具有相同的索引值。以下是在表上创建索引的语法

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...);

您可以使用一列或多列来创建索引。例如,我们可以使用tutorial_author在tutorials_tbl上创建索引。

CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author)

您可以在表格上创建简单索引。只需从查询中省略UNIQUE关键字即可创建简单索引。简单索引允许表中的重复值。

如果要按降序索引列中的值,可以在列名后面添加保留字DESC。

mysql> CREATE UNIQUE INDEX AUTHOR_INDEX
ON tutorials_tbl (tutorial_author DESC)

添加和删除INDEX的ALTER命令: 向表中添加索引有四种类型的语句:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 此语句添加了一个PRIMARY KEY,这意味着索引值必须是唯一的,不能为NULL。

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):  此语句创建一个索引,其值必须是唯一的(NULL值除外,可能多次出现)。

ALTER TABLE tbl_name ADD INDEX index_name (column_list):  这会添加一个普通索引,其中任何值都可能出现多次。

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):  这将创建一个特殊的FULLTEXT索引,用于文本搜索。

以下是在现有表中添加索引的示例。

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

您可以使用DROP子句和ALTER命令删除任何INDEX。请尝试以下示例以删除上面创建的索引。

mysql> ALTER TABLE testalter_tbl DROP INDEX (c);

您可以使用DROP子句和ALTER命令删除任何INDEX。请尝试以下示例以删除上面创建的索引。

ALTER Command to add and drop PRIMARY KEY:

您也可以以相同的方式添加主键。但请确保主键适用于非NULL的列。

以下是在现有表中添加主键的示例。这将首先使列NOT NULL,然后将其添加为主键。

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

您可以使用ALTER命令删除主键,如下所示:

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

要删除不是PRIMARY KEY的索引,必须指定索引名称。

显示INDEX信息: 您可以使用SHOW INDEX命令列出与表关联的所有索引。垂直格式输出(由\ G指定)通常对此语句很有用,以避免长线环绕:

尝试以下示例:

mysql> SHOW INDEX FROM table_name\G

答案 1 :(得分:0)

通过删除像date_sub这样的mysql函数优化你的查询,并在php中执行相同的操作并传递它 DATE_SUB PHP VERSION