FROM:http://blog.csdn.net/tianmo2010/article/details/7930482css
①MySQL Indexhtml
1、SHOW INDEX会返回如下字段mysql
一、Table 表的名称。sql
二、 Non_unique 若是索引不能包括重复词,则为0,若是能够则为1。数据库
三、 Key_name 索引的名称性能优化
四、 Seq_in_index 索引中的列序列号,从1开始。session
五、 Column_name 列名称。数据结构
六、 Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。函数
七、Cardinality 索引中惟一值的数目的估计值。经过运行ANALYZE TABLE或myisamchk -a能够更新。基数根据被存储为整数的统计数据来计数,因此即便对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。性能
八、Sub_part 若是列只是被部分地编入索引,则为被编入索引的字符的数目。若是整列被编入索引,则为NULL。
九、 Packed 指示关键字如何被压缩。若是没有被压缩,则为NULL。
十、 Null 若是列含有NULL,则含有YES。若是没有,则该列含有NO。
十一、 Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
十二、 Comment 多种评注,您可使用db_name.tbl_name做为tbl_name FROM db_name语法的另外一种形式。这两个语句是等价的:
mysql>SHOW INDEX FROM mytable FROM mydb;
mysql>SHOW INDEX FROM mydb.mytable;
2、使用 CREATE INDEX 建立索引
若是要为已存在的表建立索引,就须要使用 CREATE INDEX 命令或 ALTER TABLE 来建立索引。
CREATEINDEX idxtitle ON tablename (title)
这条命令将建立与 CREATE TABLE 命令相同的索引。
3、使用 ALTER TABLE 建立索引
ALTER TABLE tablename ADD INDEX idxtitle (title)
4、查看和删除索引
咱们可使用如下命令来查看已存在的索引:
SHOW INDEX FROM tablename
DROP INDEX indexname ON tablename
DROP INDEX 将删除 tablename 表上的 indexname 索引,indexname 就是咱们建立表时指定的索引名。
########################################
createtable c(id char(20) not null primary key,`index` char(10));
问题1.若是我忘记把id设为主键如今该怎么办?输入什么命令?
ALTER TABLE record
ADD PRIMARY KEY (id);
例如:ALTER TABLE `abc` ADD PRIMARY KEY(`a`);
问题2.若是我想把id设为主键,同时想把name改成not null,且改成varchar(10),能不能用一句命令完成问题2?
ALTER TABLE record
ADD PRIMARY KEY (id),
CHANGEname varchar(10) not null;
########################################
索引 mysql index
索引是一种数据结构,能够是B-tree, R-tree, 或者 hash 结构。其中R-tree 经常使用于查询比较接近的数据;B-trees适合用于查找某范围内的数据,能够很快的从当前数据找到下条数据;hash结构则适用于随机访问的场合,查找每条数据的时间几乎相同。显然,若要查找某个时间段的数据,用B-tree结构要比hash结构快好多。
优化查询的有效方法是为常常查询的字段创建索引,如无索引查询数据时,会遍历整张表(多么恐怖啊);如有了索引查找会容易不少。当进行 UPDATE, DELETE, 以及 INSERT 操做时,mysql会自动更新索引信息。
1.建立和删除索引( Creating and dropping indexes )
建立:
PS:当用 create index 建立索引时,必须指定索引的名字,不然mysql会报错;
用 ALTER TABLE 建立索引时,能够不指定索引名字,若不指定mysql会自动生成索引名字
创建索引时,若不想用存储引擎的默认索引类型,能够指定索引的类型:
删除:
2.索引类型
BTREE 适合连续读取数据
RTREE 适合根据一条数据找附近的数据
HASH 适合随机读取数据
FULLTEXT
SPATIAL
查看某个表中存在的索引类型
3.索引冗余
若是两个或者多个索引包含了相同的索引信息,那么就存在索引冗余。
不一样类型的索引有不一样的索引冗余判断:
(1) SPATIAL 索引
SPATIAL 只能是一个简单索引,不能说复合索引;存在冗余的状况是同一个字段有两个索引。
(2) FULLTEXT 索引
若一个FULLTEXT索引是另外一个索引的子集(不考虑字段顺序),则存在冗余。
例如: 表中包含以下两个索引
■ (field1)
■ (field1, field2)
(3) HASH 索引
若一个索引在不考虑字段顺序的状况下,索引字段相同,则存在冗余。
例如:表中包含以下两个索引
■ (field1, field2, field3)
■ (field1, field3, field2)
(4) BTREE 索引
若一个索引是另外一个索引的子集(考虑字段顺序),则存在冗余。
例如:表中包含以下两个索引
■ (field2)
■ (field2, field1)
PS:若两个或多个索引有相同的索引字段和字段顺序,可是有不一样的索引类型,这样的索引是不冗余的。由于每种索引类型有本身的索引值。
######################################
深刻MySQL数据库的索引
摘要:本文介绍索引的类型,已经如何建立索引作了介绍,其中涉及三个比较重要的SQL语句――ALTER TABLE、CREATE/DROP INDEX和CREATE TABLE,注意它们的用法。
索引是加速表内容访问的主要手段,特别对涉及多个表的链接的查询更是如此。这是数据库优化中的一个重要内容,咱们要了解为何须要索引,索引如何工做以及怎样利用它们来优化查询。本节中,咱们将介绍索引的特色,以及建立和删除索引的语法。
索引的特色
全部的MySQL列类型能被索引。在相关的列上的使用索引是改进SELECT操做性能的最好方法。
一个表最多可有16个索引。最大索引长度是256个字节,尽管这能够在编译MySQL时被改变。
对于CHAR和 VARCHAR列,你能够索引列的前缀。这更快而且比索引整个列须要较少的磁盘空间。对于BLOB和TEXT列,你必须索引列的前缀,你不能索引列的所有。
MySQL能在多个列上建立索引。一个索引能够由最多15个列组成。(在CHAR和VARCHAR列上,你也可使用列的前缀做为一个索引的部分)。
虽然随着 MySQL 的进一步开发建立索引的约束将会愈来愈少,但如今仍是存在一些约束的。下面的表根据索引的特性,给出了 ISAM 表和 MyISAM 表之间的差异:
表2-1 通道信息特征字对照表索引的特色 ISAM 表 MyISAM 表
NULL 值
BLOB 和 TEXT 列
每一个表中的索引数
每一个索引中的列数
最大索引行尺寸
不容许
不能索引
16
16
256 字节 容许
只能索引列的前缀
32
16
500 字节
今后表中能够看到,对于 ISAM 表来讲,其索引列必须定义为 NOT NULL,而且不能对 BLOB 和 TEXT 列进行索引。MyISAM 表类型去掉了这些限制,并且减缓了其余的一些限制。两种表类型的索引特性的差别代表,根据所使用的 MySQL 版本的不一样,有可能对某些列不能进行索引。例如,若是使用3.23 版之前的版本,则不能对包含 NULL 值的列进行索引。
索引有以下的几种状况:
INDEX索引:一般意义的索引,某些状况下KEY是它的一个同义词。索引的列能够包括重复的值。
UNIQUE索引:惟一索引,保证了列不包含重复的值,对于多列惟一索引,它保证值的组合不重复。
PRIMARY KEY索引:也UNIQUE索引很是相似。事实上,PRIMARYKEY索引仅是一个具备PRIMARY名称的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY。
用Alter Table语句建立与删除索引
为了给现有的表增长一个索引,可以使用 ALTER TABLE 或CREATE INDEX 语句。ALTER TABLE 最经常使用,由于可用它来建立普通索引、UNIQUE 索引或 PRIMARY KEY 索引,如:
ALTER TABLE tbl_name ADD INDEX index_name (column_list)
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)
ALTER TABLE tbl_name ADD PRIMARY KEY index_name (column_list)
其中 tbl_name 是要增长索引的表名,而 column_list 指出对哪些列进行索引。一个(col1,col2,...)形式的列表创造一个多列索引。索引值有给定列的值串联而成。若是索引由不止一列组成,各列名之间用逗号分隔。索引名 index_name 是可选的,所以能够不写它,MySQL 将根据第一个索引列赋给它一个名称。ALTER TABLE 容许在单个语句中指定多个表的更改,所以能够在同时建立多个索引。
一样,也能够用ALTER TABLE语句删除列的索引:
ALTER TABLE tbl_name DROP INDEX index_name
ALTER TABLE tbl_name DROP PRIMARY KEY
注意上面第一条语句能够用来删除各类类型的索引,而第三条语句只在删除 PRIMARY KEY 索引时使用;在此情形中,不须要索引名,由于一个表只可能具备一个这样的索引。若是没有明确地建立做为 PRIMARY KEY 的索引,但该表具备一个或多个 UNIQUE 索引,则 MySQL 将删除这些 UNIQUE 索引中的第一个。
若是从表中删除了列,则索引可能会受到影响。若是所删除的列为索引的组成部分,则该列也会从索引中删除。若是组成索引的全部列都被删除,则整个索引将被删除。
例如,对于上面所使用的student为例,你可能想为之建立这样的索引,以加速表的检索速度:
mysql> ALTER TABLE student
-> ADD PRIMARY KEY(id),
-> ADD INDEXmark(english,Chinese,history);
这个例子,既包括PRIMARY索引,也包括多列索引。记住,使用 PRIMARY索引的列,必须是一个具备NOT NULL属性的列,若是你愿意查看建立的索引的状况,可使用SHOW INDEX语句:
mysql> SHOW INDEX FROM student;
其结果为:
+---------+------------+----------+--------------+-------------+-
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+---------+------------+----------+--------------+-------------+-
| student | 0 | PRIMARY | 1 | id |
| student | 1 | mark | 1 | english |
| student | 1 | mark | 2 | chinese |
| student | 1 | mark | 3 | history |
+---------+------------+----------+--------------+-------------+-
因为列数太多,上表并无包括全部的输出,读者能够试着本身查看。
再使用ALTER TABLE语句删除索引,删除索引须要知道索引的名字,你能够经过SHOW INDEX语句获得:
mysql> ALTER TABLE student DROP PRIMARYKEY,
-> DROP INDEX mark;
再产看表中的索引,其语句和输出为:
mysql> SHOW INDEX FROM student;
Empty set (0.01 sec)
用CREATE\DROP INDEX建立索引
还能够用CREATE INDEX语句来建立索引.CREATE INDEX 是在 MySQL 3.23版中引入的,但若是使用3.23 版之前的版本,可利用 ALTER TABLE 语句建立索引(MySQL 一般在内部将 CREATE INDEX 映射到 ALTER TABLE)。该语句建立索引的语法以下:
CREATE UNIQUE INDEX index_name ON tbl_name(column_list)
CREATE INDEX index_name ON tbl_name(column_list) tbl_name、index_name 和 column_list 具备与 ALTER TABLE 语句中相同的含义。这里索引名不可选。很明显,CREATE INDEX 可对表增长普通索引或 UNIQUE 索引,不能用 CREATE INDEX 语句建立 PRIMARY KEY 索引。
可利用 DROP INDEX语句来删除索引。相似于 CREATE INDEX 语句,DROP INDEX 一般在内部做为一条 ALTER TABLE 语句处理,而且DROP INDEX是在 MySQL 3.22 中引入的。
删除索引语句的语法以下:
DROP INDEX index_name ON tbl_name
仍是上一节的例子,因为CREATE INDEX不能建立PRIMARY索引,因此这里咱们只建立一个多列索引:
mysql> CREATE INDEX mark ONstudent(english,chinese,history);
一样的检查student表,可知:
mysql> SHOW INDEX FROM student;
+---------+------------+----------+--------------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+---------+------------+----------+--------------+-------------+
| student | 1 | mark | 1 | english |
| student | 1 | mark | 2 | chinese |
| student | 1 | mark | 3 | history |
+---------+------------+----------+--------------+-------------+
而后使用下面的语句删除索引:
mysql> DROP INDEX mark ON student;
在建立表时指定索引
要想在发布 CREATE TABLE 语句时为新表建立索引,所使用的语法相似于 ALTER TABLE 语句的语法,可是应该在您定义表列的语句部分指定索引建立子句,以下所示:
与ALTER TABLE 同样,索引名对于 INDEX 和 UNIQUE 都是可选的,若是未给出,MySQL 将为其选一个。另外,这里KEY时INDEX的一个别名,具备相同的意义。
有一种特殊情形:可在列定义以后增长 PRIMARY KEY 建立一个单列的PRIMARY KEY 索引,以下所示:
该语句等价于如下的语句:
前面全部表建立样例都对索引列指定了 NOT NULL。若是是 ISAM 表,这是必须的,由于不能对可能包含 NULL 值的列进行索引。若是是 MyISAM 表,索引列能够为 NULL,只要该索引不是 PRIMARY KEY 索引便可。
在CREATE TBALE语句中能够某个串列的前缀进行索引(列值的最左边 n 个字符)。
若是对某个串列的前缀进行索引,应用 column_list 说明符表示该列的语法为 col_name(n) 而不用col_name。例如,下面第一条语句建立了一个具备两个 CHAR 列的表和一个由这两列组成的索引。第二条语句相似,但只对每一个列的前缀进行索引:
你能够检查所建立表的索引:
mysql> SHOW INDEX FROM tbl_name;
+----------+------------+----------+--------------+-------------+-
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+----------+------------+----------+--------------+-------------+-
| tbl_name | 1 | name | 1 | name |
| tbl_name | 1 | name | 2 | address |
+----------+------------+----------+--------------+-------------+-
在某些状况下,可能会发现必须对列的前缀进行索引。例如,索引行的长度有一个最大上限,所以,若是索引列的长度超过了这个上限,那么就可能须要利用前缀进行索引。在 MyISAM 表索引中,对 BLOB 或 TEXT 列也须要前缀索引。
对一个列的前缀进行索引限制了之后对该列的更改;不能在不删除该索引并使用较短前缀的状况下,将该列缩短为一个长度小于索引所用前缀的长度的列。
总结
本节对索引的类型,已经如何建立索引作了介绍,其中涉及三个比较重要的SQL语句――ALTER TABLE、CREATE/DROP INDEX和CREATE TABLE,注意它们的用法。
索引最重要的功能是,经过使用索引加速表的检索,有关这方面的知识,将在第十章数据库优化中介绍。
思考题
一、创建一个以下所述的表:
data:FLOAT列,使用随机函数填充数据
birth:DATETIME列,填充当前时间。
而后,请录入几条数据。最后计算data列的平均值、总和、极值,而且按照data列降序排序检索值。
二、分别使用标准SQL模式和扩展正规表达式模式匹配,匹配上面建立的表,假设你建立表的当前日期为2001-01-01,用模式匹配检索出birth列包含该日期的值。(实际上,上面的表中记录都是同一日期录入的,所以实际将返回所有记录。)
三、为前几章使用的数据表建立索引:
student:为id段建立一个PRIMARY索引,为english、chinese和history建立一个多列索引。
pet:为name和owner段建立一个多类索引。
四、删除为pet表建立的索引。
##################################################
MySQL Index的使用
如下是理论知识备忘:
1、什么是索引?
索引用来快速地寻找那些具备特定值的记录,全部MySQL索引都以B-树的形式保存。若是没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的全部记录,直至找到符合要求的记录。表里面的记录数量越多,这个操做的代价就越高。若是做为搜索条件的列上已经建立了索引,MySQL无需扫描任何记录便可迅速获得目标记录所在的位置。若是表有1000个记录,经过索引查找记录至少要比顺序扫描记录快100倍。
假设咱们建立了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );
而后,咱们彻底随机把1000个不一样name值插入到people表。下图显示了people表所在数据文件的一小部分:
能够看到,在数据文件中name列没有任何明确的次序。若是咱们建立了name列的索引,MySQL将在索引中排序name列:
对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。所以,若是咱们要查找name等于“Mike”记录的 peopleid(SQL命令为“SELECT peopleid FROM people WHERE name='Mike';”),MySQL可以在name的索引中查找“Mike”值,而后直接转到数据文件中相应的行,准确地返回该行的 peopleid(999)。在这个过程当中,MySQL只需处理一个行就能够返回结果。若是没有“name”列的索引,MySQL要扫描数据文件中的全部记录,即1000个记录!显然,须要MySQL处理的记录数量越少,则它完成任务的速度就越快。
2、索引的类型
MySQL提供多种索引类型供选择:
普通索引
这是最基本的索引类型,并且它没有惟一性之类的限制。普通索引能够经过如下几种方式建立:
建立索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
建立表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
惟一性索引
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的全部值都只能出现一次,即必须惟一。惟一性索引能够用如下几种方式建立:
建立索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
建立表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
主键
主键是一种惟一性索引,但它必须指定为“PRIMARY KEY”。若是你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键通常在建立表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。可是,咱们也能够经过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每一个表只能有一个主键。
全文索引
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引能够在VARCHAR或者TEXT类型的列上建立。它能够经过CREATE TABLE命令建立,也能够经过ALTER TABLE或CREATE INDEX命令建立。对于大规模的数据集,经过ALTER TABLE(或者CREATE INDEX)命令建立全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论再也不涉及全文索引,要了解更多信息,请参见MySQL documentation。
3、单列索引与多列索引
索引能够是单列索引,也能够是多列索引。下面咱们经过具体的例子来讲明这两种索引的区别。假设有这样一个people表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL AUTO_INCREMENT, firstname CHAR(50) NOT NULL, lastname CHAR(50) NOT NULL, age SMALLINT NOT NULL, townid SMALLINT NOT NULL, PRIMARY KEY (peopleid) );
下面是咱们插入到这个people表的数据:
这个数据片断中有四个名字为“Mikes”的人(其中两个姓Sullivans,两个姓McConnells),有两个年龄为17岁的人,还有一个名字不同凡响的Joe Smith。
这个表的主要用途是根据指定的用户姓、名以及年龄返回相应的peopleid。例如,咱们可能须要查找姓名为Mike Sullivan、年龄17岁用户的peopleid(SQL命令为SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age=17;)。因为咱们不想让MySQL每次执行查询就去扫描整个表,这里须要考虑运用索引。
首先,咱们能够考虑在单个列上建立索引,好比firstname、lastname或者age列。若是咱们建立firstname列的索引(ALTER TABLE people ADD INDEX firstname (firstname);),MySQL将经过这个索引迅速把搜索范围限制到那些firstname='Mike'的记录,而后再在这个“中间结果集”上进行其余条件的搜索:它首先排除那些lastname不等于“Sullivan”的记录,而后排除那些age不等于17的记录。当记录知足全部搜索条件以后,MySQL就返回最终的搜索结果。
因为创建了firstname列的索引,与执行表的彻底扫描相比,MySQL的效率提升了不少,但咱们要求MySQL扫描的记录数量仍旧远远超过了实际所须要的。虽然咱们能够删除firstname列上的索引,再建立lastname或者 age列的索引,但总地看来,不论在哪一个列上建立索引搜索效率仍旧类似。
为了提升搜索效率,咱们须要考虑运用多列索引。若是为firstname、lastname和age这三个列建立一个多列索引,MySQL只需一次检索就可以找出正确的结果!下面是建立这个多列索引的SQL命令:
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
因为索引文件以B-树格式保存,MySQL可以当即转到合适的firstname,而后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的状况下,MySQL就正确地找出了搜索的目标记录!
那么,若是在firstname、lastname、age这三个列上分别建立单列索引,效果是否和建立一个firstname、lastname、 age的多列索引同样呢?答案是否认的,二者彻底不一样。当咱们执行查询的时候,MySQL只能使用一个索引。若是你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。可是,即便是限制最严格的单列索引,它的限制能力也确定远远低于firstname、lastname、age这三个列上的多列索引。
4、最左前缀
多列索引还有另一个优势,它经过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,如今咱们有一个firstname、lastname、age列上的多列索引,咱们称这个索引为fname_lname_age。当搜索条件是如下各类列的组合时,MySQL将使用fname_lname_age索引:
firstname,lastname,age
firstname,lastname
firstname
从另外一方面理解,它至关于咱们建立了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。下面这些查询都可以使用这个fname_lname_age索引:
SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan'; SELECT peopleid FROM people WHERE firstname='Mike'; The following queries cannot use the index at all: SELECT peopleid FROM people WHERE lastname='Sullivan'; SELECT peopleid FROM people WHERE age='17'; SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';
5、选择索引列
在性能优化过程当中,选择在哪些列上建立索引是最重要的步骤之一。能够考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。请看下面这个查询:
SELECT age ## 不使用索引
FROM people WHERE firstname='Mike' ## 考虑使用索引
AND lastname='Sullivan' ## 考虑使用索引
这个查询与前面的查询略有不一样,但仍属于简单查询。因为age是在SELECT部分被引用,MySQL不会用它来限制列选择操做。所以,对于这个查询来讲,建立age列的索引没有什么必要。下面是一个更复杂的例子:
SELECT people.age, ##不使用索引
town.name ##不使用索引
FROM people LEFT JOIN town ON
people.townid=town.townid ##考虑使用索引
WHERE firstname='Mike' ##考虑使用索引
AND lastname='Sullivan' ##考虑使用索引
与前面的例子同样,因为firstname和lastname出如今WHERE子句中,所以这两个列仍旧有建立索引的必要。除此以外,因为town表的townid列出如今join子句中,所以咱们须要考虑建立该列的索引。
那么,咱们是否能够简单地认为应该索引WHERE子句和join子句中出现的每个列呢?差很少如此,但并不彻底。咱们还必须考虑到对列进行比较的操做符类型。MySQL只有对如下操做符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。能够在LIKE操做中使用索引的情形是指另外一个操做数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM peopleWHERE firstname LIKE 'Mich%';”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike';”这个查询不会使用索引。
6、分析索引效率
如今咱们已经知道了一些如何选择索引列的知识,但还没法判断哪个最有效。MySQL提供了一个内建的SQL命令帮助
1、 MySQL建表,字段需设置为非空,需设置字段默认值。
2、 MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。
3、 MySQL建表,若是字段等价于外键,应在该字段加索引。
4、 MySQL建表,不一样表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,不然没法正确使用索引进行关联对比。
5、 MySQL使用时,一条SQL语句只能使用一个表的一个索引。全部的字段类型均可以索引,多列索引的属性最多15个。
6、 若是能够在多个索引中进行选择,MySQL一般使用找到最少行的索引,索引惟一值最高的索引。
7、 创建索引index(part1,part2,part3),至关于创建了 index(part1),index(part1,part2)和index(part1,part2,part3)三个索引。
8、 MySQL针对like语法必须以下格式才使用索引:
SELECT * FROM t1 WHERE key_col LIKE 'ab%' ;
9、 SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,可是在有where条件的语句中执行效率要快。
10、 在where条件中多个and的条件中,必须都是一个多列索引的key_part属性并且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。
11、 在where条件中多个or的条件中,每个条件,都必须是一个有效索引。
12、 ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(好比都是升序或都是降序)。
十3、 全部GROUP BY列引用同一索引的属性,而且索引必须是按顺序保存其关键字的。
十4、 JOIN 索引,全部匹配ON和where的字段应创建合适的索引。
十5、 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。
十6、 按期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 。
十7、 按期使用慢日志检查语句,执行explain,分析可能改进的索引。
十8、 条件容许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。