简单的MySQL查询调整100万条记录

时间:2014-09-04 11:55:00

标签: mysql

我只是尝试在db表中运行简单查询,该表有近100万条记录。问题是执行简单查询需要花费数小时的时间。请检查以下查询。

Select * from users where (status='active' or status='pending') and 
usertype='buyer'

我尝试用各种可能的方法为列状态和usertype创建索引,但我没有看到任何结果。

我正在使用InnoDB数据库。我只想要一些调整技巧,我可以在几秒钟内获得结果。

谢谢。

4 个答案:

答案 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)
);