Mysql 如何获得更快的选择索引?
这是我桌子的结构Mysql 如何获得更快的选择索引?,mysql,database,indexing,Mysql,Database,Indexing,这是我桌子的结构 create table bids ( id int unsigned auto_increment primary key, user_id int unsigned not null, shipment_id int unsigned not null, amount double(8, 2)
create table bids
(
id int unsigned auto_increment
primary key,
user_id int unsigned not null,
shipment_id int unsigned not null,
amount double(8, 2) not null,
commission double(8, 2) not null,
invoice_id int unsigned null,
created_at timestamp default CURRENT_TIMESTAMP not null,
accepted_at timestamp null,
retracted_at timestamp null
)
collate = utf8mb4_unicode_ci;
create index bids_shipment_id_index
on bids (shipment_id);
create index bids_user_id_index
on bids (user_id);
create index bids_user_id_shipment_id_index
on bids (user_id, shipment_id)
表中有大约6000万行
运行一个简单的查询:SELECT*fromsbids,其中user\u id=3344代码>大约需要2秒
如何使此查询运行得更快?正如Andreas在上文中所评论的,如果查询使用索引,您至少已经有两个索引可能会有所帮助
您应该使用EXPLAIN
确认优化器正在为查询选择索引。优化器可能出于某种原因拒绝使用索引。例如,如果用户_id 3344出现在大量行上,那么优化器可能会决定索引不会保护任何工作
出于同样的原因,像“the”这样的常用词也不包括在书后的索引中。在一本书的索引中查找一个常用词是浪费时间的,因为它只会告诉你这个词出现在书的大部分页面上。读这本书的每一页,从头到尾都会更容易
您尚未分享有关MySQL服务器调优选项的任何详细信息。您可能有一个较小的innodb缓冲池,并且查询从磁盘进行了太多的读取,然后一次又一次地从缓冲池中逐出页面。缓冲池的大小应与数据集成比例。我在很多应用程序中使用的一个很好的起点是缓冲池和磁盘上数据大小的比例为1:10
检查缓冲池大小:SELECT@@innodb\u buffer\u pool\u size代码>
检查数据大小:从ENGINE='InnoDB'所在的INFORMATION_SCHEMA.TABLES中选择SUM(数据长度+索引长度)代码>
您尚未描述服务器规范。对于这种规模的数据,您是否有动力不足的服务器?您使用老式的旋转磁盘还是SSD存储?数据是存储在NFS之类的远程卷上,还是存储在AWS中的是EBS?远程卷肯定要慢得多。使用本地连接的高速存储器
您还没有描述数据库服务器上还运行着什么。服务器是否也在运行要求很高的应用程序?提高性能的一个好方法是在专用服务器上运行数据库,而不让其他数据库或应用程序争夺资源。您已经在用户id
上有了索引,因此您不能再做任何事情了。--请注意,索引bids\u user\u id\u index
是冗余的,因为两列索引bids\u user\u id\u shipping\u id\u index
以user\u id
开头,所以您应该删除索引bids\u user\u id\u index
,以提高插入性能。不要发布表的图像。将CREATE TABLE
和本例中的CREATE INDEX
语句作为文本发布。您可以尝试。这一点的成功与否主要取决于所查询表的碎片。表使用的是哪个引擎?@RickJames InnoDB。