标签:针对 相关 启用 空间 帮助 作用 服务 from 常用
一、常见sql技巧
1、正则表达式的使用
2、巧用RAND()提取随机行
mysql数据库中有一个随机函数rand()是获取一个0-1之间的数,利用这个函数和order by一起能够吧数据随机排序,
、 mysql>select * from stu order by rand();
下面是通过limit随机抽取了3条数据样本。
mysql>select * from stu order by rand() limit 3;
3、利用GROUP BY 的WITH ROLLUP子句统计
使用group by的with rollup子句可以检索出更多的聚合信息。
mysql>select cname,pname,count(pname) from demo group by cname,pname;
同样使用with rollup关键字后,统计出更多的信息。注意:with rollup不可以和order by同时使用。
mysql>select cname,pname,count(pname) from demo group by cname,pname with rollup;
4、用BIT GROUP FUNCTIONS 做统计
在使用group by语句时可以同时使用bit_anf、bit_or函数来完成统计工作,这两个函数的主要作用是做数值之间的逻辑位运算。
mysql>select id,bit_or(kind) from order_rab group by id; //二进制位运算
对order_rab表中id分组时对kind做位与和或计算。
mysql>select id,bit_and(kind) from order_rab group by id; //二进制余运算,只有11才为1
5、使用外健要注意的问题
创建外健如下:
mysql>create table temp(id int,name char(20),foreign key(id) references outTable(id) on delete cascade on update cascade));
注意:innodb类型的表支持外健,myisam类型的表,虽然创建可以成功,但不起作用,主要原因是不支持外健。
6、mysql中help的使用
a、?%可以获得所有mysql>里的命令,
b、?create
c、?opt%,因为记不住全称。
二、mysql的优化
1、优化sql语句的一般步骤
通过show status命令了解各种sql的执行频率。
格式:mysql>show [session|global] status;
session:(默认)表示当前链接
globla:表示自数据库启用至今
如:mysql>show status;
mysql>show global status;
mysql>show status like "Com_%";
mysql>show global status like "Com_%";
参数说明:
Com_select 执行select操作的次数,一次查询值累计加1
Com_update 执行update操作的次数
Com_insert 执行insert操作的次数
Com_delete 执行delete操作的次数
只针对Innodb引擎的:
InnoDB_rows_read执行select操作的次数
InnoDB_rows_update执行update操作的次数
InnoDB_rows_insert执行insert操作的次数
InnoDB_rows_delete执行delete操作的次数
其他:
connections链接mysql的数量
Uptime服务器已经工作的秒数
Slow_queries慢查询的次数
2、定位执行效率较低的sql语句:
a、explain select * from table where id = 1000;
b、desc select * from table where id = 1000;
c、优化的顺序:
1)查看慢查询日志,日志里查询超过10秒的说明产寻幽问题
2)通过desc定位这条语句哪里有问题。
3)通过方案对问题点进行优化,如加索引
2、索引问题
索引实数据库优化中最常见的也是最重要的手段之一,通过索引通常可以帮助用户姐绝大多数的sql性能问题。
1)索引的存储和分类:
MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独一的一个文件;InnoBDB存储引擎的表的数据和索引是存储在同一个表空间里面,但可以由多个文件组成。
mysql目前不支持函数索引,但是能对列的前面某一部分进行进行索引,例如name字段,可以去name的前2个字符进行索引,这个特性可以大大缩小文件的大小,用户在设计表结构的时候也可以对文本列根据此特性进行灵活设计。
mysql>create index ind_company2_name on company2(name(4));//company表名,ind_company2_name索引名
2)mysql如何使用索引
索引用于快速找出在某个列中有一特定值的行。对相关列使用索引是提高SELECT操作性能的最佳途径。
a、使用索引
(1)对于创建的多行索引,只要查询的条件中用到最左边的列,索引一般就会被使用。如下创建一个复合索引。
mysql>create index ind_sales2_com_mon onsales2(company_id,moneys);
然后按company_id进行查询,发现使用到了复合索引。
mysql>explain select * from sales2 where company_id=2006\G;
使用下面的查询就没有使用复合索引。
mysql>explain select * from sales2 where moneys=1\G;
(2)使用like的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能被使用,如下:
mysql>explan select * from company2 where name like "%3"\G;
3、存在索引但不使用索引
(1)如果mysql估计使用索引比全表扫描更慢,则不使用索引。例如如果列key_prat1均匀分布在1-100之间,查询时使用索引就不是很好
mysql>select * from table_name where ley_part1>1 and key_part<90;
(2)如果使用MEMORY/HEAP表并且where条件中不使用“=”进行索引列,那么不会用到索引。Heap表只有在“=”的条件下使用索引。
(3)用or分割的条件,如果or前的条件中的列有索引,二后面的列没有索引,那么涉及的索引都不会用到。
(4)如果不是索引列的第一部分,如下例子:可见虽然在money上面建有复合索引,但是由于money不是索引的第一列,那么在查询中,这个索引也不会被mysql采用。
mysql>explan select * from sales2 where moneys=1\G;
(5)如果like是一%开始,可见虽然在name上家有索引,但是由于条件中的like的值的“%”在第一位了,那么mysql也不会采用这个索引。
(6)如果列类型是字符串,但在查询时把第一个数值型常量赋值给了一个字符类型的列名name,那么虽然在name列上有索引,但是也没有用到。
mysql>explain select * from company2 where name=294\G;
3、两个简单的优化方法
4、常用sql的优化
标签:针对 相关 启用 空间 帮助 作用 服务 from 常用
原文地址:https://www.cnblogs.com/yuyangphpweibo/p/9044374.html