索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间。
(简单的说就是SQL有没有索引都行,有的话查询速度更快 )
索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书。在数据库中,数据库程序使用索引可以重啊到表中的数据,而不必扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表.
创建索引:
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_name ON {table_name | view_name} [WITH [index_property [,....n]]
说明:
UNIQUE: 建立唯一索引。
CLUSTERED: 建立聚集索引。
NONCLUSTERED: 建立非聚集索引。
Index_property: 索引属性。
UNIQUE索引既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构。
删除索引:
DROP INDEX table_name.index_name[,table_name.index_name]
说明:table_name: 索引所在的表名称。
index_name : 要删除的索引名称。
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name ON table_name (column_name)
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name ON table_name (column_name)
本例会创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndex ON Person (LastName)
如果您希望降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
CREATE INDEX PersonIndex ON Person (LastName DESC)
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
Python: 几种数据类型索引 1、python listCREATE INDEX PersonIndex ON Person (LastName, FirstName)
多维列表可以看成嵌套的列表
1) 获取单个元素
正确✅打开方式:
>>> a = [[1,2,3], [4,5,6]] >>> a [[1, 2, 3], [4, 5, 6]] >>> a[0][0] 1 >>> a[1][0] 4 >>> a[1][2] 6
错误❌打开方式:
>>> a[1,0] Traceback (most recent call last): File "", line 1, in TypeError: list indices must be integers or slices, not tuple
2) 获取多个元素
正确✅打开方式:
>>> a[:][:] [[1, 2, 3], [4, 5, 6]] >>> a[0] [1, 2, 3] # 多维列表可以看成嵌套的列表,这里第一层是[1,2,3]和[4,5,6]两个列表, # 所以a[0]这是获取第一层的第一个列表 >>> a[0][0:1] # 这是获取列表第一层第一个列表[1,2,3]的由0:1组成的列表 [1] #这里需要注意⚠️的是:a[0][0:1] 返回的是一个列表,而a[0][0]返回的是一个值 >>> type(a[0][0:1])>>> type(a[0][0])
容易混淆的打开方式:
>>> a[0:1][0] # 你以为返回的是1或者[1],其实正确答案如下: [1, 2, 3] # 为什么?因为a[0:1]是返回列表第一层第0:1个列表组成的列表, # 所以是[[1,2,3]],还是一个二维列表,所以a[0:1][0]返回的是[1, 2, 3] # 这样就能理解为什么下面的索引会失败了 >>> a[0:1][1] Traceback (most recent call last): File "2、 numpy array", line 1, in IndexError: list index out of range # 也能理解下面为什么二维列表居然能用三维下标了 >>> a[0:1][0][0] 1
>>> import numpy as np
>>> b = np.array(a)
>>> b
array([[1, 2, 3],
[4, 5, 6]])
>>> b[0][0]
1
>>> b[0,0] # 惊奇地发现这种方式合法了,amazing!
1
list和array如此之相像,在写程序过程中有时候会混淆,而如果搞不清楚list和array,例如把list当成了array,则上述索引a[0,0] 就会报错。
array实际上是矩阵的形式,[0, 0]这种方式就是按照矩阵的思路来理解的,所以它可以按列来获取元素
>>> b[:2, :1]。# 获取到了0、1行的第0列
array([[1],
[4]])
同时,array保留了类似[0][0]方式,和list操作及结果一样。我们来对比一下:
>>> b[:2][:1] array([[1, 2, 3]]) >>> a[:2][:1] [[1, 2, 3]]3、pandas Dataframe
>>> import pandas as pd >>> c = pd.Dataframe(a, columns=['col0','col1', 'col2']) >>> c col0 col1 col2 0 1 2 3 1 4 5 6
在Dataframe里,体系是完全不一样的,不能用list和array的方式来做索引。如果非要那么做的话,要采用iloc。iloc基本是把Dataframe看成array,可以用行/列序号来索引。
>>> c[0][0]
Traceback (most recent call last):
File "/Users/xxx/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 3063, in get_loc
return self._engine.get_loc(key)
File "pandas/_libs/index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
File "pandas/_libs/index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
File "pandas/_libs/hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
File "pandas/_libs/hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0. # ...未完,相当长一段错误提示
# 正确✅打开方式
>>> c.iloc[0][0]
1
Dataframe非常好的一点是把列都取了名字,可以直接按列名字获取一列或者多列。
>>> c['col0'] #返回的是Series类型 0 1 1 4 >>> c[['col0','col1']] #返回的是Dataframe类型 col0 col1 0 1 2 1 4 5
但是在获取多列的时候要⚠️注意,必须把多列用[]括起来,否则....出错没商量...
>>> c['col0','col1'] Traceback (most recent call last): File "", line 1, in File "/Users/l.... #此处省略错误提示若干
那么,怎么获取行呢?用loc。loc还可以获取指定名字的行、列。
# 获取第0行 >>> c.loc[0] col0 1 col1 2 col2 3 Name: 0, dtype: int64 >>> c.loc[:2] col0 col1 col2 0 1 2 3 1 4 5 6 # 获取指定行、列 >>> c.loc[:2, 'col0'] 0 1 1 4 Name: col0, dtype: int64 >>> c.loc[:2, ['col0']] col0 0 1 1 4 # c.loc[:2, 'col0'] 和 c.loc[:2, ['col0']]区别在哪里?返回的类型不一样!!! >>> type(c.loc[:2, 'col0'])#Series类型 >>> type(c.loc[:2, ['col0']]) #Dataframe类型 >>> for each in c.loc[:2, 'col0']: ... print(each) ... 1 4 >>> for each in c.loc[:2, 'col0'].iterrows(): # Series不能iterrows ... print(each) ... Traceback (most recent call last): File " ", line 1, in File "/U
摘抄一段Series的描述:“Series是Pandas中的一维数据结构,类似于Python中的列表和Numpy中的Ndarray,不同之处在于:Series是一维的,能存储不同类型的数据,有一组索引与元素对应。”
我们再来看一下有无[]的values的差别:
>>> c.loc[:2, 'col0'].values # 这个是行
array([1, 4])
>>> c.loc[:2, ['col0']].values # 这个返回列的形式的numpy array
array([[1],
[4]])
当要获取多个列时,必须用[]括起来:
#错误❌ >>> c.loc[:2, 'col0', 'col1'] Traceback (most recent call last): File "", line 1, in File "/Users/xxx/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py", line 1472, in __getitem__ return self._getitem_tuple(key) File "/Users/liqiong/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py", line 875, in _getitem_tuple self._has_valid_tuple .... # 此处省去错误提示若干行 # 正确✅示范: >>> c.loc[:2, ['col0', 'col1']] col0 col1 0 1 2 1 4 5
Python的索引知识比较复杂,这里只讲最简单的部分。
如果对python的索引感兴趣,可以看Python索引(一) - 简书
这位作者写的就很详细
部分来源:
SqlServer索引的原理与应用 - 张龙豪 - 博客园
Python索引(一) - 简书



