Not all posts showing in query

There seems to be a syntax in your Query:

post_type="posts&posts_per_page=-1"

would mean that your post type is posts&posts_per_page=-1

I think you mean

$posts_query = new WP_Query('post_type=post&posts_per_page=-1');

(The post type is not posts, but post)

In this case WordPress would not apply anyhting at all (because it contain errors, but just fetches the default post type with setting (that is set in dashboard) “nr of posts”.

My opinion is that you always should array(s) as arguments to the WP_Query, because it’s more readable and easier to debug.

$args = array(
    'posts_per_page' => -1,
    'post_type' => 'post',
);

$posts_query = new WP_Query($args);

In your case it would not matter, but when you want to extend functionality to include let’s say a taxonomy it would be

$args = array(
    'posts_per_page' => -1,
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'people',
            'field'    => 'slug',
            'terms'    => 'bob',
        ),
    ),
);
$query = new WP_Query( $args );