Mysql 即使索引在大表上,查询速度也很慢
我正在执行一个简单的select查询,以从包含54864行的表日志中提取用户名。 检索数据大约需要7.836秒。 我怎样才能加快表演速度Mysql 即使索引在大表上,查询速度也很慢,mysql,Mysql,我正在执行一个简单的select查询,以从包含54864行的表日志中提取用户名。 检索数据大约需要7.836秒。 我怎样才能加快表演速度 SELECT username FROM `logs` WHERE logs.branch=1 and logs.added_on > '2016-11-27 00:00:00' 在描述表上 +-------------------+-------------+------+-----+---------+----------------+ | F
SELECT username FROM `logs`
WHERE
logs.branch=1
and
logs.added_on > '2016-11-27 00:00:00'
在描述表上
+-------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | char(255) | YES | MUL | NULL | |
| fullname | char(255) | YES | | NULL | |
| package | char(255) | YES | | NULL | |
| prev_expiry | date | YES | | NULL | |
| recharged_upto | date | YES | | NULL | |
| payment_option | int(11) | YES | MUL | NULL | |
| amount | float(14,2) | YES | | NULL | |
| branch | int(11) | YES | MUL | NULL | |
| added_by | int(11) | YES | | NULL | |
| added_on | datetime | YES | MUL | NULL | |
| remark | text | YES | | NULL | |
| payment_mode | char(255) | YES | | NULL | |
| recharge_duration | char(255) | YES | | NULL | |
| invoice_number | char(255) | YES | | NULL | |
| cheque_no | char(255) | YES | | NULL | |
| bank_name | char(255) | YES | | NULL | |
| verify_by_ac | int(11) | YES | | 0 | |
| adjusted_days | int(11) | YES | | NULL | |
| adjustment_note | text | YES | | NULL | |
+-------------------+-------------+------+-----+---------+----------------+
20 rows in set
在解释问题时
+----+-------------+--------------------------+------+-----------------------------+--------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------------+------+-----------------------------+--------------+---------+-------+------+-------------+
| 1 | SIMPLE | logs | ref | branch_index,added_on_index | branch_index | 5 | const | 37 | Using where |
+----+-------------+--------------------------+------+-----------------------------+--------------+---------+-------+------+-------------+
1 row in set
更新::解释添加复合索引后的查询Branch\u added\u索引
+----+-------------+--------------------------+------+------------------------------------------------+--------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------------+------+------------------------------------------------+--------------+---------+-------+------+-------------+
| 1 | SIMPLE | logs | ref | branch_index,added_on_index,branch_added_index | branch_index | 5 | const | 37 | Using where |
+----+-------------+--------------------------+------+------------------------------------------------+--------------+---------+-------+------+-------------+
1 row in set
在分支上添加一个复合键,在分支上添加_,以便覆盖自使用和以来的所有WHERE条件
ALTER TABLE logs ADD KEYbranch,已添加
这应该快得多,而且您可以删除branch_索引键,因为上面的索引可以替换它。您只返回54000中的37行,所以基数是确定的
ALTER TABLE logs DROP INDEX `branch_index`;
也可以使用索引提示
SELECT username FROM `logs` USE INDEX (branch_added_index) WHERE
logs.branch=1
and
logs.added_on > '2016-11-27 00:00:00'
在2个字段分支上创建一个复合索引,添加如下内容:
ALTER TABLE `logs` ADD KEY idx_branch_added (branch, added_on);
如果表的现有索引已用于其他查询,请尝试添加新的复合索引,如下所示
在logsbranch上创建索引,在上添加索引这将更快,因为它涵盖:
INDEX(branch, added_on, username) -- in exactly that order.
并删除任何作为此项前缀的索引
基数很少重要。并且解释经常得到错误的值
解释显示分支大小为5-它真的需要为空吗?你们会有20亿分支机构吗?考虑使用更小的东西,例如1字节TyyIn无符号非空值0…255。< /P>
此外,将255缩小到合理的范围
描述表格时,请使用“显示创建表格”;它更具描述性。这可能有助于了解引擎Charset,等等。我已经按照您的建议创建了复合索引,但查询执行时间仍然不确定improved@kamalrumba添加新的解释并删除旧的解释index@kamalrumba从新的解释中,我看到查询仍然使用旧的索引。只需删除itI我已经按照您的建议删除了索引,并且查询执行时间大大提高。您能解释一下为什么在同一列上单独创建的索引比合成索引慢。@简言之,新索引具有更好的基数,当旧索引选择所有日志时,它可以同时考虑这两种情况。branch=1,然后它扫描另一列。我想我们收到了消息