我有一个php/mysql应用程序,我有在我的项目中的所有行动的所有选择查询的日志。我想知道有没有可能得到任何关于select x, y from t1 where (con1 AND con2) OR con3 order by colx的建议,即哪些列必须被索引到我的日志中?
我有很多这样的查询,也有连接。我听说EXPLAIN可以帮助我为这个查询建议哪些列必须是索引。我想知道怎样才能知道哪些列必须是索引。多列索引、单列索引。order by需要被索引等等。
我刚刚开始在我的MySQL数据库中使用INDEXes,我有点不确定我的想法是否能起作用。我有一个文本字段,它可以存储大量文本,需要进行搜索,还有另一个id INT字段。如果我在我id_column字段上有一个索引,在我的text_column上有一个全文索引,MySQL会在查询中同时使用这两个索引吗
SELECT * FROM notes WHERE id_column='123' AND MATCH(text_column) AGAINST(search_text)
??
其次,我有一组可以经常用于组合搜索的列。如果我在这些列中创建多列索引,如果使用的列在索引中从左到右排列在
我正在尝试学习mysql的“通过优化来排序”,所以我搜索相关的主题并找到官方的说:
索引使用的一个条件是索引必须具有相同的同质性,但不必具有相同的实际方向。如果查询混合了ASC和DESC,那么如果索引还使用相应的混合升序和降序列,优化器可以在列上使用索引:
SELECT * FROM t1
ORDER BY key_part1 DESC, key_part2 ASC;
优化器可以在( key_part1,key_part2)上使用索引,如果key_part1正在下降,而key_part2正在上升。如果key_part1正在上升,而key_part2正在下降,则还可以对这些列使用索
我有一个数据透视表,当然每一行都会包含在一个查询中:
mysql> select * from blog_posts as bp
join blog_joins as bj
on bj.post_id=1
and bj.taxonomy_id=10
and bj.type = 1;
下面是我的表结构:
是否建议为每一列建立索引?如果没有,为什么?你会推荐什么?
mysql > alter table blog_joins add index pid (post_id);
mysql > alter tab
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
为这个表和这些搜索查询定义索引的正确方法是什么?
好的,我在这里有一个SQL查询:
SELECT a.id,... FROM article AS a WHERE a.type=1 AND a.id=3765 ORDER BY a.datetime DESC LIMIT 1
我想按国家和id获取准确的文章,并为该索引创建两列type和id。Id也是主键。我使用EXPLAIN关键字来查看使用了哪个索引,它使用的不是多列索引,而是主键索引,但我确实在创建索引时准确地设置了where内容。
MySQL是否使用主键索引而不是多列索引,因为主键索引更快?或者我应该强制MySql使用多列索引?
附注:刚刚注意到,当只有一个结果行时,使用order是很愚
当我使用Mysql时,我正在尝试更好地理解索引。一个问题是,我仍然很难确定我应该使用哪种类型的索引,如单个索引、多列索引、覆盖索引等。
我的一个问题是,有没有一个通用规则来决定使用哪种类型的索引?当我设计我的数据库布局时,我不知道所有的查询将使用什么,直到应用程序完成构建。对于一个表,我可以在一个或多个字段上查询,也可以查询它以进行报告。因此,如果我像这样查询一个表:
SELECT * FROM table1 WHERE field1 = this AND field2 = that GROUP BY field3 ORDER BY field4
我会在field1、field3、field3
我有一个名为'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
我有一个包含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没有使用完整的索引来回答查询。让我解释一下。我正在通过MySQL版本5.1.73-1 (Debian)使用imdb数据库.我用列(itid_inf25_mid_ndx,info(25),movie_id)在表movie_info_idx上创建和索引“info_type_id”。列info_type_id和movie_id是整数( NULL),info是文本类型,因此每个索引条目都需要4+27+4 =35个字节。句子输出:
EXPLAIN
SELECT movie_id
FROM movie_info_idx
WHERE info_type_id = 101
AND i
如果我有一个包含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和我不知道这到底是什么意思。
我有一个110万行表(150 by ),其中每一行都有一个列的范围,其中一个列具有我正在分组的15个可能的状态。
任何带有计数的选择都小于0.05秒,例如:
SELECT variant, count(*)
FROM `log`
当我的GROUP BY达到0.7秒时,例如:
SELECT variant, count(*)
FROM `log`
GROUP BY variant
变体列有一个索引。每行唯一的id是主键。
不确定我的查询是否不好,或者我的web主机性能不佳。
PS,我现在在一台高规格的机器上安装了MySQL,运行查询所用的时间是0.55。看起来没那么慢。
我在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)
如果有一个包含这两列的复合索引,那么这个查询的性能会更好吗?
让我们从一个简单的例子开始:
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;
+----+-------------+-------+------+---------------+------
我有一个类似于以下内容的MySQL查询:
SELECT *
FROM products
LEFT JOIN descriptions ON products.DescriptionID = descriptions.ID
WHERE MATCH (name, overview, specs) AGAINST ('ram');
我试图使用MATCH() AGAINST()搜索的所有列都是全文,但在phpMyAdmin中进行测试时会出现以下错误:
#1210 - Incorrect arguments to MATCH
如果我只MATCH一个列,它就不会出错,而且工作正常,但
在运行以下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
假设我有一个数据库表,其中包含a、b和c列。我计划对所有这三列进行查询,但我不确定查询的是哪一列。表中有足够的行,索引极大地加快了搜索速度,但是对可能的索引进行所有排列是错误的(如下图所示):
a
b
c
a, b
a, c
b, c
a, b, c
有没有更好的方法来处理这个问题?(我很可能只对a、b、c进行索引,因为这将很快减少行数,但我想知道是否有更好的方法。)
如果需要更具体的示例,在实际数据中,列是城市、州和邮政编码。另外,我使用的是MySQL数据库。
我还在摸索MySQL索引...一个小问题..。
我有一个存储成员位置的表。它有一个member_id和location_id列...我执行一个MySQL查询来查找特定成员的所有位置...
这样设置一个索引是不是更好:
ALTER TABLE `members_locations` ADD INDEX `member_location` ( `member_id` , `location_id` )
或者我应该像this>那样将它们分开
ALTER TABLE `members_locations` ADD INDEX `member_id` ( `member_id` );
ALTER