1.索引优化
添加索引主要是为了增加查询速度,避免mysql对数据表进行全耗时的全表扫描。
主键唯一索引--primary key ,数据表
的id一般都是主键索引,通常配合auto_increment使用,一张表只能有一个主键索引
普通索引index。
UNIQUE 唯一索引。 不允许有重复。数据表中可以有多个
FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。
多列索引--即给多个字段添加一个索引 ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。
多列索引还有另外一个优点,它通过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引: firstname,lastname,age firstname,lastname firstname。
在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一,可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。
那么,我们是否可以简单地认为应该索引WHERE子句和join子句中出现的每一个列呢?差不多如此,但并不完全。我们还必须考虑到对列进行比较的操作符类型。MySQL只有对以下操作符才使用索引:<=,=,,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE 'Mich%';”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike';”这个查询不会使用索引
2.使用sql语句查询单条数据时带上limit 1,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
3.用explain 拼接sql查询语句,查询性能。进行优化
4.避免 SELECT *,需要取什么数据就取什么数据
5.尽可能的使用 NOT NULL
6. 选择正确的存储引擎
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。酷壳以前文章《MySQL: InnoDB 还是 MyISAM?》讨论和这个事情。
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都 无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
下面是MySQL的手册
添加索引主要是为了增加查询速度,避免mysql对数据表进行全耗时的全表扫描。
主键唯一索引--primary key ,数据表
的id一般都是主键索引,通常配合auto_increment使用,一张表只能有一个主键索引
普通索引index。
UNIQUE 唯一索引。 不允许有重复。数据表中可以有多个
FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。
多列索引--即给多个字段添加一个索引 ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);
如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。
多列索引还有另外一个优点,它通过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引: firstname,lastname,age firstname,lastname firstname。
在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一,可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。
那么,我们是否可以简单地认为应该索引WHERE子句和join子句中出现的每一个列呢?差不多如此,但并不完全。我们还必须考虑到对列进行比较的操作符类型。MySQL只有对以下操作符才使用索引:<=,=,,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE 'Mich%';”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike';”这个查询不会使用索引
2.使用sql语句查询单条数据时带上limit 1,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
3.用explain 拼接sql查询语句,查询性能。进行优化
4.避免 SELECT *,需要取什么数据就取什么数据
5.尽可能的使用 NOT NULL
6. 选择正确的存储引擎
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。酷壳以前文章《MySQL: InnoDB 还是 MyISAM?》讨论和这个事情。
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都 无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
下面是MySQL的手册