一、基本语句优化
1.尽量避免在列上进行运算,这样会导致索引失败。例如:
select * from table where DATE_FORMAT(`customer_regtime`,'%Y')>='2010'
优化为
select * from table where customer_regtime>='2010-01-01'
2.在使用join时,应该根据功能的需要尽量使用小结果集驱动大结果集。同时把复杂的join查询拆分成多个query。因为join多表时,可能导致更多的锁定和堵塞。
3.仅列出需要的字段,这对查询速度没有影响,但是对内存可以节省很多。例如:
select * from customer;
优化为
select customer_id,customer_name from customer;
4.使用批量插入时节省交互例如:
insert into a1(name) values('name1');
insert into a1(name) values('name2');
insert into a1(name) values('name3');
insert into a1(name) values('name4');
优化为:
insert into a1(name) values('name1'),('name2'),('name3'),('name4');
5.limit 的基数比较大时,可以使用where between 或其他方式代替。
6.不要使用rand函数获取多条随机数据例如:
select * from a2 order by rand() limit 20;
可以使用php参数随机数使用 mysql in 查询 。
7.避免使用null
8.不要使用count(id),因该使用count(*)
9.不要做无谓的排序操作,尽可能的在索引中完成。
二、索引与性能分析
查看sql执行的效率可以通过开始 profiling 来查看
set profiling =;
开启后执行sql语句mysql就会分析执行该sql 的详细报告
例如 多执行几遍
select * from a2;
然后 查看
show profiles;
第一次用时是最长的比后面的时间变多了几乎一倍,这是因为mysql缓存了查询。
如果需要查看某一个语句的细节可以使用
show profile cpu,block io for query ;
结果为:
查看select 语句在执行过程中是否用到索引,如果是联合查询时联合的顺序类型等信息可以使用explain
explain select * from a2;
结果为:
个属性含有如下
id:查询序列号
select_type:查询的类型,主要包括普通查询,联合查询、子查询。
table:查询的表明。
type:联合查询使用的类型。
possible_keys:表示mysql能使用哪个索引在该表中找到该行。如果这个值是空就表示没有用到索引,可以通过检查where子句,看看是否引用了某些字段。
key:显示mysql实际决定使用的键。如果没有索引被应用则为空。
key_len:显示mysql决定使用的键长度。如果键是null这个也是null。这个值反应出一个多重主键里实际使用了哪部分。
ref:显示哪个字段或常数与key一起被使用。
rows:这个值表示mysql要便利多少数据才能找到需要的结果集,在innodb上不准确。
extra:如果是 only index,意味着信息只能用索引树中的信息检索,这比扫描整个表要快,如果是where used,则表示使用了where 限制,但是用索引还不够,如果是impossi-ble where,则表示通过收集到的统计信息判断出不可能存在的结果。除此之外,extra还有下面一些可能值:using filesort:表示包含orderby 且无法使用索引进行排序操作时,不得不使用相应的排序算法实现。using temporary:使用临时表,常见于orderby和group by。select tables optimized way:使用聚合函数,并且mysql进行了快速定位。通常是max,min,count(*) 等函数。
type特别说明:type显示的访问类型是较重要的指标:结果重好到坏一次是:system(系统表),const(读常量),eq_tef(最大一条比配结果,通常是通过主键访问),ref(被驱动表索引引用),fulltext(全文索引检索),ref_of_null(带空值的索引查询),index_merge(合并索引结果集),unique_subquery(子查询中返回的字段是唯一组合或索引),index_subquery(子查询返回的是索引,但非主键),range(索引范围扫描),index(全索引烧苗),all(全表扫描)。
一般来说,保证查询至少range级,最好能达到ref级。all为全表扫描,是最坏的情况,表示没有用到索引。
索引的建立和使用原则:
合理设计和使用索引。
在关键字段的索引上,建与不建索引,查询数度相差近100倍。
差的索引和没有索引想过一样。
索引并非越多越好,因为维护需要成本。
每个表的索引在5个一下,应合理利用部分索引和联合索引。
不在结果集中的结果单一的列上建立索引。比如性别字段只有0和1两种结果,在这个字段上建立索引不会有太大的帮助。
建索引的字段结果集最好分布均匀,或者符合正态分布。
mysql 语句的索引和优化的更多相关文章
-
MySQL引擎、索引和优化(li)
一.存储引擎 存储引擎,MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术 ...
-
mysql语句添加索引
1.PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2. ...
-
MySQL有关Group By的优化
昨天我写了有关MySQL的loose index scan的相关博文(http://www.cnblogs.com/wingsless/p/5037625.html),后来我发现上次提到的那个优化方法 ...
-
千万级MySQL数据库建立索引,提高性能的秘诀
实践中如何优化MySQL 实践中,MySQL的优化主要涉及SQL语句及索引的优化.数据表结构的优化.系统配置的优化和硬件的优化四个方面,如下图所示: SQL语句及索引的优化 SQL语句的优化 SQL语 ...
-
MySQL如何利用索引优化ORDER BY排序语句
MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...
-
MySQL如何利用索引优化ORDER BY排序语句 【转载】
本文转载自:http://blog.csdn.net/ryb7899/article/details/5580624 .感谢相关作者. MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执 ...
-
MySql基础笔记(二)Mysql语句优化---索引
Mysql语句优化--索引 一.开始优化前的准备 一)explain语句 当MySql要执行一个查询语句的时候,它首先会对语句进行语法检查,然后生成一个QEP(Query Execution Plan ...
-
《MySQL慢查询优化》之SQL语句及索引优化
1.慢查询优化方式 服务器硬件升级优化 Mysql服务器软件优化 数据库表结构优化 SQL语句及索引优化 本文重点关注于SQL语句及索引优化,关于其他优化方式以及索引原理等,请关注本人<MySQ ...
-
(转)理解MySQL——索引与优化
参考资料:http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html ———————————— 全文: 写在前面:索引对查询的速度有着 ...
随机推荐
-
WCF服务一:WCF服务简介
一.回顾开发历史: 软件架构的设计经历了:从面向对象程序,到面向组件程序设计,再到面向服务程序设计.这三种方式都致力于同一个目标:封装和重用. 面向对象程序设计:类封装功能并提供代码重用. 面向组件程 ...
-
JNI笔记之 初体验
Java Native Interface提供了java与c语言写的代码之间互相调用的方式.在c语言方面jni.h中声明了许多的类型和方法,有很多java的数据类型和c语言类型的转换方法函数. jav ...
-
RFID Hacking①:突破门禁潜入FreeBuf大本营
某天,偶然间拿到了FreeBuf Pnig0s同学的工卡信息,终于有机会去做一些羞羞的事情了 引子 以下故事纯属虚构,如有雷同,纯属巧合. 我应聘了一个大型IT公司的"网络攻击研究部经理&q ...
-
TP复习
第一课,三步骤 1,.名称 2.路径 3.引用核心文件 4,.公用的可以建立public upload css 等 第二课 uRL四中模式 ~ActionClass.php 一.什么是MVC / ...
-
Grep 命令 用法大全
查找x文件 find / -name "x*" -ls 查找文件中x所在的行数 grep -n "x" -r *find . -name "*.jav ...
-
android学习(2) 多线程的理解
多线程操作UI的运行原理: UI线程:首先启动app时,系统会自动启动一个UI线程,然后此线程会创建一个Looper(注:Looper构造函数会实例化一个MessageQueue的消息队列存在变量mQ ...
-
FxMaker用法
第一步:选sceneFxMaker幕后,执行 第二步:执行界面,选中EffectParticle制作粒子特效 第三步:随便点中一个粒子特效.例如以下所看到的 第四步:点中右側的"Explos ...
-
spring实现读写分离
(转自:http://www.cnblogs.com/surge/p/3582248.html) 现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数 ...
-
Python基础3切片,字符串的方法
切片:截取字符串某一段字符,并不改变原字符串.结构:[起始位置:终止位置:步长] 但不包括终止位置.所谓:顾头不顾尾 索引:序列中每个元素都是有编号的,都是从0开始编号的.使用负数索引时,Pytho ...
-
Java Date Compare
Date a;Date b;假设现在你已经实例化了a和ba.after(b)返回一个boolean,如果a的时间在b之后(不包括等于)返回true b.before(a)返回一个boolean,如果b ...