例如,我有一张homes桌子:
CREATE TABLE IF NOT EXISTS `homes` (
`home_id` int(10) unsigned NOT NULL auto_increment,
`sqft` smallint(5) unsigned NOT NULL,
`year_built` smallint(5) unsigned NOT NULL,
`geolat` decimal(10,6) default NULL,
`geolng` decimal(10,6) default NULL,
PRIMARY KEY (`home_id`),
KEY `geolat` (`geolat`),
KEY `geolng` (`geolng`),
) ENGINE=InnoDB ;
Run Code Online (Sandbox Code Playgroud)
是否有意义,我使用的复合指数都geolat和geolng,这样的:
我替换:
KEY `geolat` (`geolat`),
KEY `geolng` (`geolng`),
Run Code Online (Sandbox Code Playgroud)
有:
KEY `geolat_geolng` (`geolat`, `geolng`)
Run Code Online (Sandbox Code Playgroud)
如果是这样:
更新:
由于很多人都声明它完全依赖于我执行的查询,因此下面是最常见的查询:
SELECT * FROM homes
WHERE geolat BETWEEN ??? AND …Run Code Online (Sandbox Code Playgroud) 在以下查询中
SELECT col1,col2
FROM table1
WHERE col3='value1'
AND col4='value2'
Run Code Online (Sandbox Code Playgroud)
如果我在col3上有一个单独的索引,而在col4上有另一个索引,那么在这个查询中将使用哪一个?
我在某处读到,对于查询中的每个表,只使用一个索引.这是否意味着查询无法使用这两个索引?
其次,如果我同时使用col3和col4创建了一个复合索引,但在WHERE子句中只使用了col3,那么性能会更差吗?例:
SELECT col1,col2
FROM table1
WHERE col3='value1'
Run Code Online (Sandbox Code Playgroud)
最后,在所有情况下使用覆盖索引是否更好?MYISAM和innodb存储引擎有什么不同?
我正在寻找向MYSQL数据库中的表添加复合索引,该数据库的大小可能是几百万行.复合材料将包含两个varchar列以及三个int列.我的问题如标题所述:是否存在创建此综合指数的最佳顺序?例如,其中一个int行可能只有6个可能的值,那么该列是否更接近索引定义的前端?同样,其中一个varchar列可能有数百万个不同的值,如果它们靠近索引定义的前面或后面?
以下两个索引之间是否有任何差异?
如果有,有什么区别?
create table IndexTables (
id int identity(1, 1) primary key,
val1 nvarchar(100),
val2 nvarchar(100),
)
create index IDX_IndexTables_1 on IndexTables (val1, val2)
GO
create index IDX_IndexTables_2 on IndexTables (val2, val1)
GO
Run Code Online (Sandbox Code Playgroud) 我有一个表IDENTITY列作为主键(经典ID列).
SQL Server自动为该主键创建聚簇索引.
我的问题是:
如果是,我如何删除默认聚簇索引并重新创建具有此属性的新索引.
感谢您的支持
我有一张表Blah(纬度浮点数,经度浮点数,create_time日期,owner_id int,.....)
我的代码只做一个查询
select *
from Blah
where latitude < l1 and latitude > l2
and longitude < ll1 and longitude > ll2
and create_time < t1 and create_time > t2
and owner_id < o1 and owner_id > o2 ;
Run Code Online (Sandbox Code Playgroud)
(当然值l1,l2,...... o1,o2是来自程序的动态参数)
我的问题是我应该创建什么样的索引; 综合指数?在复合索引的情况下,我应该先放哪一列?指数的效果如何?
我想了很久,并且找不到有关oracle索引如何工作的详细文档.
我可以找到使用B-tree实现的文档,在我们的例子中:B-tree中的每个键都是一个4元组:( column1,column2,column3,column4),其中这些元组的排序关系被定义为词汇订购.
那么对于上面的查询,假设我们的顺序是(owner_id,create_time,纬度,经度),我猜oracle首先需要二进制搜索到点(o1,t1,l1,ll1),对于这个操作,索引确实是有用.但接下来,我们需要找到第一个interium的终点:我们需要找到(o1,t1,l1,ll2),这也可以通过二分搜索来完成.
接下来,我们需要找到满足条件的下一部分,所以我们需要找到(o1,t1,lx,ll1)其中lx是大于l1的下一个值,我们也可以通过二分搜索找到它.但在我们的情况下,很可能对于相同的纬度,经度不会超过1,因此这里的二分搜索并不比线性扫描更有效.
遵循这种精神,似乎我们应该首先使用小值范围基数列,在本例中为create_time,如果我们的点仅在几天内创建.如果我们从不做范围条件,但只有等于(=)条件,那么哪个列是第一列并不重要,对吧?
为了更清楚,这是一个更简单的例子:
假设我有2列,X和Y.
在db中,两者的值都是[1,2,.... 100],所以我们有100x100行
我的疑问是
select * from mytable where X > 34 and X < 78 and Y > 12 and Y < 15;
Run Code Online (Sandbox Code Playgroud)
说我们的索引是(X,Y),所以两个值之间的比较规则是
v1 < v2 <=====> …Run Code Online (Sandbox Code Playgroud) 我有很多表,我有外键索引,以及包含这些外键的聚簇索引.例如,我有一个如下表:
TABLE: Item
------------------------
id PRIMARY KEY
owner FOREIGN KEY
status
... many more columns
Run Code Online (Sandbox Code Playgroud)
MySQL为主键和外键生成索引,但有时,我想提高查询性能,因此我将创建聚簇索引或覆盖索引.这导致索引具有重叠列.
INDEXES ON: Item
------------------------
idx_owner (owner)
idx_owner_status (owner, status)
Run Code Online (Sandbox Code Playgroud)
如果我删除了idx_owner,通常使用的未来查询idx_owner将只使用,idx_owner_status因为它具有owner索引中的第一列.
值得留意idx_owner吗?idx_owner_status即使MySQL只使用部分索引,是否还有额外的I/O开销?
编辑:我真的只对InnoDB关于索引的行为感兴趣.
我有一个带有复合主键的(大)表,由 5 列(a、b、c、d、e)组成。
我想有效地选择具有给定值的其中两列(a + e)的所有行。
在 PostgreSQL 中,我需要一个索引吗?或者数据库会使用主键(甚至部分使用?)
我看过下面的帖子,其中指定 MySQL 可以使用多列索引的最左边部分来有效地查询行。但我在复合主键上没有找到 PostgreSQL 的任何内容。
postgresql indexing primary-key composite-index composite-primary-key
如果我在(a,b)上有一个复合索引,我理解只关注'a'的查询仍将使用复合索引(但不是与'b'有关的查询)
我的问题是,如果我有(a,b)索引,是否有任何正当理由在'a'上设置单列索引?我所读过的关于(a,b)索引是否完全替代a或者仅仅是"总比没有"的索引似乎含糊不清.
这假设我通过a和a,b进行过滤.我有一个表太多索引的表,这会损害写入性能,并希望在删除索引之前仔细检查,我只是相当肯定没有做任何好事.
此外,这个答案会根据我使用InnoDb还是MyISAM而改变?有关的表格是MyISAM,但我们的大部分表格都是InnoDb.
复合指数是否有利于这样的事情:
SELECT * FROM a INNER JOIN b ON(a.id=b.id)
INNER JOIN c ON(a.bar=c.id)
INNER JOIN d ON(a.foo=d.id)
Run Code Online (Sandbox Code Playgroud)
指数将是:
(a.id, a.bar, a.foo)
Run Code Online (Sandbox Code Playgroud) composite-index ×10
indexing ×7
mysql ×6
sql ×2
sql-server ×2
innodb ×1
optimization ×1
oracle ×1
postgresql ×1
primary-key ×1
t-sql ×1