前言:
在数据库表中,使用索引可以大大提高查询速度。 假如我们创建了一个 testIndex 表:
CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL);
一、索引分单列索引和组合索引
二、介绍一下索引的类型
1、普通索引。
CREATE INDEX indexName ON tableName(tableColumns(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定 length,下同。 ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定: CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;
2、唯一索引。
CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表结构: ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定: CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));
3、主键索引
CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID));
当然也可以用 ALTER 命令。记住:一个表只能有一个主键。4、全文索引
DROP INDEX index_name ON tableName
三、单列索引和组合索引
CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL,
vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );
vc_Name,vc_City
vc_Name
SELECT * FROM myIndex WHREE vc_Name="erquan"
SELECT * FROM myIndex WHREE vc_City="郑州"
四、使用索引
会使用索引,而 SELECT * FROM myIndex WHEREt vc_Name like'%erquan' 就不会使用索引了。
五、索引的不足之处
讲了这么多,无非是想利用索引提高数据库的执行效率。不过索引只是提高效率的一个因素。如果你的MySQL 有大数据的表,就需要花时间研究建立最优秀的索引或优化查询语句。
六、使用索引的注意事项
1、索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
2、使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3、索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4、like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5、不要在列上进行运算
select * from users where YEAR(adddate)<2007; 将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select * from users where adddate<‘2007-01-01’;
6、不使用NOT IN和<>操作