mysql中索引使用一些优化方法与注意事项

下边是在网上找到的一些资料,保留下来备用吧

1,创建索引
对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

2,复合索引
比如有一条语句是这样的:

 代码如下 复制代码
select * from users where area=’beijing’ and age=22;

如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

3,索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

4,使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

5,排序的索引问题
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

6,like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

7,不要在列上进行运算

 代码如下 复制代码
select * from users where YEAR(adddate)<2007;

将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成

 代码如下 复制代码

select * from users where adddate<‘2007-01-01’;

8,不使用NOT IN和<>操作

NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。

时间: 2024-11-17 06:23:12

mysql中索引使用一些优化方法与注意事项的相关文章

mysql中group by用法与having合用注意事项

group by函数应该的使用应该是SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数,但是今天帮同事调试一个mysql中的group by函数,让我大跌眼镜,当时感觉不可思议,然后回来做了个简化版试验,试验过程如下: mysql表结构  代码如下 复制代码 mysql> desc t; +---+----–+--+-–+---+---+ | Field | Type | Null | Key | Default | Extra | +---+----

MySQL中索引优化distinct语句及distinct的多字段操作_Mysql

MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例.   实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary key(a)) engine=INNODB

mysql中explain函数的使用方法

mysql 语句的执行效率影响整个网站的运行,那么随时检查mysql语句的效率是至关重要的,使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的,可以帮我们分析查询语句或是表结构的性能瓶颈. EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的--. 挑一个你的SELECT语句(推荐挑选那个最复杂的,有多表联接的),把关键字EXPLAIN加到前面.你可以使用phpmyadmin来做这个事.然后,你会看到一张表格. 下面的这个示例中,

Mysql中分页查询两个方法比较

mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1;   SELECT a FROM foo WHERE b = 1 LIMIT 100,10; 1    另外一种是使用SQL_CALC_FOUND_ROWS 1 2 SELECT SQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10; SELECT FOUND_ROWS(

mysql中的load命令使用方法_Mysql

使用mysql 中的load 命令,讲txt 文件中的内容加载到数据库表中,例如,创建table,名称是user,一个字段username:当前有db.txt文件,内容是以空格分开的用户名,例如:xiaowang xiaoliu zhangsan 将该文件加载到数据表user中,使用命令即可: 复制代码 代码如下: load data local infile "/home/beaver/db" into table user lines terminated by ' ';  作者

探究MySQL中索引和提交频率对InnoDB表写入速度的影响_Mysql

本次,我们来看看索引.提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的. 先直接说几个结论吧: 1.关于索引对写入速度的影响: a.如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%: b.如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%: 因此,InnoDB表最好总是有一个自增列做主键. 2.关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例): a.等待全部数据写入完成后,最后再执行com

简单的MySQL中导出CSV的各种方法

 代码如下 复制代码 select * from test_info   into outfile '/tmp/test.csv'   fields terminated by ',' optionally enclosed by '"' escaped by '"'   lines terminated by 'rn'; MySQL中导入CSV格式数据:  代码如下 复制代码 load data infile '/tmp/test.csv'   into table test_inf

mysql.ini cpu过高优化方法

mysql教程.ini cpu过高优化方法 tmp_table_size=200m  tmp_table_size越大,被转化为disk tmp table的概率越 小 php教程程序页面mysql及时关闭 设置mysql超时时间 low-priority-updates 设置查询与更新优先 及 low_priority_updates = no;设置读优先级 wait_timeout = 10;  大概10秒就可以了. table_cache=1024 物理内存越大,设置就越大.默认为2402

浅谈SEO过程中网页关键词的修改方法与注意事项

在SEO的相关论坛中经常会看到一些网友发帖说,想去修改一下自己的网页标题或者关键词,因为大部分想修改的朋友都是没有把握自己到底能不能修改完毕之后,百度不会将自己的网站或者网页进行降权或者K的处理.首先我们必须要弄明白三个问题: 1.百度对于关键词修改的处理方式与处理原则; 2.我们为什么要修改网站或者网页关键词; 3.目前百度虽然是一个中文引擎功能非常强大的搜索引擎,我们还的考虑一下,我们的流量分布情况,到底是百度的多还是谷歌的多,还是搜狗的多,还是Bing的多,还是Yahoo的多,还是soso