我只是尝试在db表中运行简单查询,该表有近100万条记录。问题是执行简单查询需要花费数小时的时间。请检查以下查询。
Select * from users where (status='active' or status='pending') and
usertype='buyer'
我尝试用各种可能的方法为列状态和usertype创建索引,但我没有看到任何结果。
我正在使用InnoDB数据库。我只想要一些调整技巧,我可以在几秒钟内获得结果。
谢谢。
答案 0 :(得分:0)
创建Index
。
此处提供更多信息:
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
在这里: http://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html
我更喜欢带有约束的btree(或自定义类型)索引。
答案 1 :(得分:0)
首先,写下这样的查询:
Select *
from users
where status in ('active', 'pending') and usertype = 'buyer';
in
比一堆or
更容易阅读。
接下来,创建以下索引:
create index users_usertype_status on users(usertype, status);
答案 2 :(得分:0)
好的......
您有三个级别的调整。
物理调整: 购买更多磁盘。
物理层调整: 创建索引就像 在用户(状态)上创建索引idx_users_status; 在用户(用户类型)上创建索引idx_users_usertype;
你们都可以使用视图作为子结果。
create v_buyers as Select * from users where usertype='buyer';
select * from v_buyers where status in ('active', 'pending');
这可以为多核机器提供调整效果。
答案 3 :(得分:0)
好的,如果您的数据是时间范围,则可以使用RANGE-Partitioning
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);
或列表 - 对"买家"
进行分区CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY LIST(store_id) (
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);