Mysql应用mysql索引优化实例(单列索引与组合索引)
《Mysql应用mysql索引优化实例(单列索引与组合索引)》要点: 索引一般用于在数据规模大时对查询进行优化的一种机制,来查询符合要求的结果;MYSQL学习 如果借助于mysql索引,mysql会将要索引的字段依照一定的算法进行处理,并生成一个类似于书本目录的文件存放在相应的位置,这样在查询时,mysql会先去查找这些"目录",然后根据这些"目录"来快速定位所需记录的位置,这样的查找不用遍历整个记录集,速度自然会很快,对于海量数据尤其如此.MYSQL学习 注意,在向存在索引的表中插入数据时,因为要维护索引信息,要比不存在索引的表慢一些,因此当数据量大时,可以考虑在插入完数据之后再建立索引. 1、单列索引 --创建包含单列索引的index_test_single_a表 --创建不包含单列索引的index_test_single_b表 其中a表包含title的单列索引,b表的title字段不存在索引,但是两个表都有一个主键id,其实主键也是索引的一种,这个会在后面详细解释.? 1.1、测试查询索引字段所用的时间,代码如下: ? //phpinfo(); ? ini_set('max_execution_time',200); ? $con = mysql_connect("localhost:3306","root","710100"); ? if (!$con) ? {? ??? die('could not connect: ' . mysql_error()); ? } ? else{ ??? mysql_select_db("test",$con); ? ??? $sqla = "select * from index_test_a where title = "title_4999";";??? ??? $sqlb = "select * from index_test_b where? title = "title_4999";"; ??? $starttimea = microtime(); ??? ??? $result = mysql_query($sqla) or?? die( "invalid?? query:?? "?? .?? mysql_error()); ??? ??? $endtimea = microtime();??? ??? echo "a表查询所有记录所用时间:".(($endtimea-$starttimea)*1000)."毫秒"; ??? echo "<br>"; ??? ??? $starttimeb = microtime(); ??? $result = mysql_query($sqlb) or?? die( "invalid?? query:?? "?? .?? mysql_error()); ??? ??? $endtimeb = microtime(); ??? echo "b表查询所有记录所用时间:".(($endtimeb-$starttimeb)*1000)."毫秒"; ??? mysql_close($con); // by www.jbxue.com ? } ? ?> ? 执行结果如下: b表查询所有记录所用时间:44.484毫秒MYSQL学习 可以看到仅仅10000条记录的查找差别,时间已经相差了几十倍,因此对于经常查询的字段,索引是十分必要的.相应的,如果我们查询没有做索引的字段,那么是没有区别的,将以上的sql语句改为: $sqlb = "select * from index_test_b where? content = 'content_4999';"; ? 结果如下: 1.2、测试like查询MYSQL学习 在我们项目中,如果数据量大,则不推荐like查询,因为其查询效率比较低,但是对于索引字段来说,like能命中吗?MYSQL学习 可以将sql语句改成如下所示: $sqlb = "select * from index_test_b where title like '4999%'"; 测试结果: 可以看到对于模糊查询来说,如果是前缀匹配,则会命中索引,但是如果我们将sql改为后缀匹配或者任意匹配,那么二者所消耗的查询时间是一致的: $sqlb = "select * from index_test_b where title like '%4999'"; $sqla = "select * from index_test_a where title like '%4999'"; $sqlb = "select * from index_test_b where title like '%4999'"; ? a表查询所有记录所用时间:44.742毫秒 即二者都没有命中索引.MYSQL学习 1.3、测试or语句,将sql改为如下所示: $sqlb = "select * from index_test_b where? content='content_4999' or title="mysql索引优化实例(单列索引与组合索引)";"; ? 测试结果如下: b表查询所有记录所用时间:50.131毫秒MYSQL学习 继续将sql改为如下: $sqlb = "select * from index_test_b where? id=4999? or title="mysql索引优化实例(单列索引与组合索引)";"; ? 测试结果如下: b表查询所有记录所用时间:47.318毫秒MYSQL学习 从上面的结果可以看到,当or中有一个字段没有索引的时候,那么将不会命中索引;反之,如果or运算的所有字段均做了索引,那么是可以命中的.MYSQL学习 1.4、测试in,将sql语句继续改为如下所示: $sqlb = "select title from index_test_b? where title in ('title_4999','title_5000');"; ? 测试结果为: ?可见对于索引字段,in也是可以命中索引的.MYSQL学习 1.5、测试<,>,between等,将sql改为如下所示: $sqlb = "select title from index_test_b? where num < 999;"; ? 测试结果如下: 可见二者差别不是很大,因此是没有命中索引的.MYSQL学习 1.6、对于mysql函数,索引的命中,将sql改为如下所示: $sqlb = "select num from index_test_b? where? char(num) in ('999','9999');"; ? 得到的结果如下所示: 所以如果在条件中使用函数,那么索引将会失效.MYSQL学习 2、组合索引MYSQL学习 组合索引包括对多个列的索引,而不是多个单列索引的组合,将表a中的所以改成(title,num)的组合索引,进行以下测试:MYSQL学习 2.1、or测试MYSQL学习 将sql语句改成如下所示: $sqlb = "select * from index_test_b where? num=4999 or title="mysql索引优化实例(单列索引与组合索引)";"; ? ?结果如下所示: 这时索引没有命中,索引组合索引的or运算和两个单列索引的or运算是不同的,前者失效而后者依然有效.MYSQL学习 2.2、and测试MYSQL学习 将sql语句改成如下所示: $sqlb = "select * from index_test_b where? num=4999 and title="mysql索引优化实例(单列索引与组合索引)";"; ? ?结果如下所示: 继续改为: $sqlb = "select * from index_test_b where? num=4999 ;"; ? ?得到的结果: ?而改成如下sql: $sqlb = "select * from index_test_b where? title="mysql索引优化实例(单列索引与组合索引)" ;"; ? ?得到的结果则为: 由以上三组结果可以看出,组合索引是最左前缀匹配的,即条件中要包含第一个索引列,才会命中索引.MYSQL学习 3、索引的优缺点MYSQL学习 利用索引可以大大加快我们的搜索,但是维护索引需要额外的开销,尤其是当索引较多的时候,大量的数据会很容易带来索引量的膨胀,因此对于频繁要用到的查询,才需要做索引,这样才能以最小的代价获得最大的性能提升. 《Mysql应用mysql索引优化实例(单列索引与组合索引)》是否对您有启发,欢迎查看更多与《Mysql应用mysql索引优化实例(单列索引与组合索引)》相关教程,学精学透。编程之家PHP学院为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |