我为医院里的病人准备了一张桌子,因此随着时间的推移,这个表可能包含数万行。医院唯一的ID编号(BIGINT)分配给作为主密钥的每个病人,其余的列是VARCHAR或CHAR,以及一个单一日期列。据我所知,主键是自动索引的,因此根据病人的ID进行搜索是最佳的(?)。
患者可以通过一个字段或该ID、姓名、地址、出生日期等的组合进行搜索。我可以通过在每个字段上创建索引来优化我的搜索吗?当对这些INDEXed字段的组合执行搜索时,此优化是否也能工作,例如
SELECT * FROM patients WHERE first_name="John" AND address="bl
我有一个包含25亿条记录的表(2.5Cr.)我正在尝试获取基于索引列的记录计数。执行相同的代码需要115秒。
查询
Select count(1) from table1 where column=code
Table1: table with 2 billion (2 Cr.)
code gets resultset from DB with 1 to 10k rows,
Column is indexed.
Server Details
Intel Xeon 3.10ghz
8 gb RAM
MySQL server 5.1
MySQL Connector 5.0.6
My.cn
我们的MySQL(Percona Server)数据库有一个包含1000万行的大表,有很多比40秒更长的慢查询:
SELECT col1, Seller, col3, col4, Id, col5
FROM table1
WHERE Seller = 346761
AND col1 IN (2, 3, 4)
AND col3 = 1
AND col4 NOT IN (5,6,7)
ORDER BY Id DESC
LIMIT 0, 20;
我在Seller、col1、col3、col4上创建了索引。这些索引是单独的,而不
MySQL可以使用两个或多个索引搜索表行吗?
我有一张有这些列的桌子:
relation:
- type varchar(32)
- id_foo int
- id_bar int
我需要基于type和presta_id或vario_id搜索行。查询将如下所示:
SELECT id_foo FROM relation WHERE type = 'baz' AND id_bar = 128
SELECT id_bar FROM relation WHERE type = 'qux' AND id_foo = 256
为这个表和这些搜索查询定义索引的正确方法是什么?
我有一个名为'test‘的简单MySQL表,其中有两列:
调用'id'Varchar(3000)列的自动增量int列称为“textcol”
我在表中创建了一个索引,该索引是基于“textcol”列的。但是,ORDER查询似乎没有使用索引,即在一个简单查询上的EXPLAIN语句在文本中的ORDER显示为NULL,并且在其输出的键列中显示为NULL,并且还使用文件。
任何要更改以帮助使用ORDER索引的指针对我来说都是有用的。
由"mysql -版本“命令提供的MySQL版本:
mysql Ver 14.14远端5.1.58,用于使用readline 6.2的deb
我在MySQL中有一个有两列的表
id int(11) unsigned NOT NULL AUTO_INCREMENT,
B varchar(191) CHARACTER SET utf8mb4 DEFAULT NULL,
身份是PK。
我需要使用这两种方法之一在查询中进行查找。id in (:idList) or B in (:bList)
如果有一个包含这两列的复合索引,那么这个查询的性能会更好吗?
我刚刚开始在我的MySQL数据库中使用INDEXes,我有点不确定我的想法是否能起作用。我有一个文本字段,它可以存储大量文本,需要进行搜索,还有另一个id INT字段。如果我在我id_column字段上有一个索引,在我的text_column上有一个全文索引,MySQL会在查询中同时使用这两个索引吗
SELECT * FROM notes WHERE id_column='123' AND MATCH(text_column) AGAINST(search_text)
??
其次,我有一组可以经常用于组合搜索的列。如果我在这些列中创建多列索引,如果使用的列在索引中从左到右排列在
如果我有一个包含3列索引的MyISAM表,如下所示
create table t (
a int,
b int,
c int,
index abc (a, b, c)
) engine=MyISAM;
问题是,下面的查询能否充分利用索引:
select * from t where a=1 and c=2;
换句话说,考虑到索引是一棵b树,MySQL是否可以跳过中间的列,同时仍然对第一列和最后一列进行快速搜索?
EXPLAIN似乎确实显示将使用索引,但是,额外的说明说:Using where; Using index和我不知道这到底是什么意思。
说我有这样的疑问:
EXPLAIN SELECT *
FROM (
SELECT "A" as a, i.n FROM (SELECT 1 AS n) AS i
UNION ALL SELECT "B" as a, i.n FROM (SELECT 1 AS n) AS i) AS t
WHERE a = "B";
MySQL说
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
我意识到,当为用于"ORDER“的列创建索引时,对MySQL查询的响应变得更快。
SELECT username FROM table ORDER BY registration_date DESC
现在,我想知道应该创建哪些索引来优化请求时间。例如,我经常使用以下查询:
SELECT username FROM table WHERE
registration_date > ".(time() - 10000)."
SELECT username FROM table WHERE
registration_date > ".(ti
我不能说我是MySQL的专家,更多的是新手。但我知道一些基本的性能成本概念。话虽如此,
我有一个大约100万行的用户配置文件表。我想过滤这些值,只得到我感兴趣的东西。
在这些列中,我有纬度和经度列。
为了过滤它的“距离”方面,我创建了一个带有纬度范围和经度范围的任意矩形。
除了“距离”属性之外,我还有一些通用属性,比如年龄、性别等。
我索引了所有的字段,包括纬度和经度。我使用浮子类型的lat和long,BTW。
因此,它是一个简单的SELECT查询,具有多个属性,如下所示
SELECT user_id FROM profiles WHERE gender = 1 AND birthday BE
在运行以下SQL语句之后,您将看到,在运行了MySQL first ALTER TABLE语句之后,已经在tag_id列上自动创建了非唯一索引ALTER TABLE。
但是在第二个 ALTER TABLE语句运行之后,我认为MySQL还应该为我在question_id列上自动创建另一个非唯一的索引question_tag_question_id_question_id。
但是,从SHOW INDEXES语句输出中可以看到,它并不存在。
为什么MySQL会忘记第二次 ALTER TABLE语句?
顺便说一句,由于我已经创建了一个唯一的索引question_id_tag_id_idx,使用了 qu
用于使用复合b-树索引SELECT * from customers where gender = 'M' AND date_of_birth < '2000-01-01'的所有列的查询。
CREATE INDEX low_then_high ON customer (gender, date_of_birth); CREATE INDEX high_then_low ON customer (date_of_birth, gender);之间有什么区别吗
一个类似的问题是,但被接受的答案并没有解释建议背后的原因。
我在询问MySQL,但我猜答案将适用于任
我有一个有两列的表,batch_id和study_id。这两列都有索引。我想从MySQL得到一个随机的行。
我最初写道:
SELECT * FROM alt_join_batch_study ORDER BY RAND() LIMIT 1
但事实证明这很慢。这是解释。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE alt_join_batch_study ALL NULL NULL NULL N
我有一个包含消息列表的MySQL表,其中每条消息都属于一个房间。我做这样的查询:
SELECT * FROM messages WHERE room='offtopic' ORDER BY id DESC LIMIT 5;
随着我的表增加到数十万条消息的数量,数据库变得有点慢。我添加了一个名为room的索引,不是唯一的,不是压缩的,列空间(5),现在基数是425。
这会对性能有所帮助吗?也就是我做得对吗?
表结构:
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| total | int(11) |
假设您有一个表,其中有A和B列。在表上创建多列索引(A,B)。
您的查询是否必须考虑索引的顺序?例如,
select * from MyTable where B=? and A in (?, ?, ?);
在查询中我们将B放在第一位,第二位放在第二位。但指数是(A,B)。命令重要吗?
Update:我确实知道,从最左边的前缀规则来看,索引的顺序非常重要。但是,哪一列在查询本身中排在第一位重要吗?
我正尝试在我的数据库中运行以下查询:
SELECT * FROM ts_cards WHERE ( cardstatus= 2 OR cardstatus= 3 ) AND ( cardtype= 1 OR cardtype= 2 ) ORDER BY cardserial DESC LIMIT 10;
所有三个字段(cardstatus、cardtype和cardserial)都被编入索引:
mysql> SHOW INDEX FROM ts_cards;
+----------+------------+----------------+--------------+
让我们从一个简单的例子开始:
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL,
`value` CHAR(12) NOT NULL,
INDEX (`id`),
INDEX (`value`)
) ENGINE = InnoDB;
所以两列都被索引了。我认为这意味着MySQL不再需要读取实际的表了,因为所有的数据都存储在索引中。
mysql> EXPLAIN SELECT id FROM test WHERE id = 1;
+----+-------------+-------+------+---------------+------
我想知道,如果条件包含了列中所有可能的值,那么是否需要设置一个条件语句来删除标准。示例如下:
SELECT product FROM Table where condition = 'condition' AND class <= 255;
假设类列是TINYINT unsigned NOT NULL DEFAULT 0的。MySQL是否仍会忠实地扫描列以检查class <= 255是否?假设我有1000万行,那么上面的查询对下面的语句是如何执行的呢?
SELECT product FROM Table where condition = 'conditio
使用以下表达式:FALSE AND (expression)
MySQL是对表达式求值,还是一看到FALSE就继续前进
一些背景上下文--我想通过执行以下操作来加快查询速度:
JOIN... ON (indexed_column1=indexed_column2 AND non_indexed_column_a=non_indexed_column_b)
有关执行此查询的原因的背景信息,请参阅
如果它总是计算non_indexed_column_a=non_indexed_column_b,那么就不会节省任何时间。